繁体   English   中英

信号处理程序行为

[英]Signal Handler Behavior

我对系统调用信号,终止和信号处理程序有一些疑问。 我有以下代码:

int figlio=-1;
int main(int argc,char* argv[])
    int pid1,pid2,dormi,numero;
    float reciproco;
    signal(SIGUSR1,gestore);
    signal(SIGUSR2,gestore);
    numero=atoi(argv[1]);
    printf("Numero %d\n\n",numero);
    fflush(stdout);
    pid1=fork();
    if(pid1>0)  //PADRE
    {
        pid2=fork();
        if(numero%2 == 0)
            kill(pid1,SIGUSR1);
        else
            kill(pid2,SIGUSR2);
        wait(NULL);
        wait(NULL);
    }
    if(pid1 == 0)   //FIGLIO1
    {   
        //sleep(1);
        printf("%d\n",figlio);
        if(figlio == 1)
        {
            numero=numero*numero*numero;
            fflush(stdout);
            printf("Ho eseguito il cubo %d\n",numero);
        }
        else
        {
            pause();
            if(figlio == 1) //Se il gestore di SIGUSR1 è partito
            {
                fflush(stdout);
                printf("Ciao dal figlio 1\n");
            }
        }
        printf("Figlio1 termina\n\n");
        exit(0);
    }
    if(pid2 == 0)   //FIGLIO2
    {
        if(figlio == 2)
        {
            dormi=numero;
            reciproco=(float)numero;
            reciproco=1/reciproco;
            fflush(stdout);
            printf("Ho eseguito il reciproco %f\n",reciproco);
            sleep(dormi);
            fflush(stdout);
            printf("Mando un segnale a mio fratello %d\n",pid1);
            kill(pid1,SIGUSR1);
        }
        else
            printf("Arrivederci e grazie\n");
        printf("Figlio2 termina\n\n");
        exit(0);
    }   
    return 0;
}

void gestore(int signo)
{
    if(signo == SIGUSR1)
        figlio=1;
    else
        figlio=2;
}

1)我不明白为什么第一个孩子中的第一个printf会在...之前返回-1而没有sleep(1)...似乎是在孩子开始之后执行了处理程序。
2)当一个孩子被杀时,此后,调度程序对孩子起作用还是继续对父亲起作用?
3)当发送终止消息或调度程序在子进程上运行时,执行处理程序?

  1. fork() ,父进程和子进程处于竞争状态。 无法保证在孩子到达printf()调用之前,父母有机会向孩子发出kill() printf()调用。

  2. 如果有多个处理器,则两个进程可以同时运行。 否则,如果子进程当前未在运行,则Linux将设置一些内部状态,以便在下次运行子进程时将信号传递给该子进程,并且如果该子进程尚未运行,则将其标记为可运行。

  3. 如果孩子当前正在跑步,则信号将立即得到处理。 否则,它将在下一个孩子运行时进行处理。 处理程序作为处理信号的结果而运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM