C信号处理错误,发出亲子联系

时间:2017-01-08 19:16:34

标签: c linux signals fork

目标:使父进程计数器正确,counter1 = 5,counter2 = 8.

程序应该创建2个子进程。他们中的每一个都将SIGUSR1和SIGUSR2的设定号分别发送给父母。分别为5和8次。

为了简化,在多次崩溃导致我的系统注销,关闭所有程序并强制我登录后,我正在打印有关父进程的信息。目标是用那些替换那些印刷品 kill(getppid(),SIGUSR1) //和SIGUSR2用于第二个子进程。

当前的子工作功能:

void childWork(int loopCounter, int sigNum)
{
    for(; loopCounter>0; loopCounter--)
    {
        if(SIGUSR1==sigNum) //kill(getppid(),SIGUSR1); 
            printf("[%d] sending SIGUSR1 to %d\n", getpid(),getppid());
        else if(SIGUSR2 == sigNum) //kill(getppid(), SIGUSR2);
            printf("[%d] sending SIGUSR2 to %d\n", getpid(),getppid());
    }
}

这是用于清理的僵尸处理函数:

void handleZombie(int sig) {
    while (1) {
            pid_t pid = waitpid(0, NULL, WNOHANG);
            if (pid < 0) {
                    if (errno == ECHILD)
                            return;
                    printf("Error, cleaning\n");
            }
            if (pid == 0)
                    return;


    }

最后是主要的:

    int main(int argc, char** argv)
{
    printf("[%d] PARENT started! My parent: %d\n", getpid(), getppid());
    childrenLeft=2;
    setHandler(handleZombie,SIGCHLD);
    setHandler(sigHandler1, SIGUSR1);
    setHandler(sigHandler2, SIGUSR2);
    int i;
    for(i=1;i<=childrenLeft;i++)
    {
        pid_t pid = fork();
        if(pid < 0)
            printf("Error - fork\n");
        if(pid==0)
            if(i==1)
            {
                printf("[%d] child created!\n", getpid());
                childWork(5,SIGUSR1);
            }
            if(i==2)
            {
                childWork(8, SIGUSR2);
                printf("[%d] child created!\n", getpid());
            }
            exit(EXIT_SUCCESS);
    }

    printf("Work finished, final numbers:\nSIGUSR1 received: %d\nSIGUSR2 received: %d\n",sig1Count,sig2Count);
    while (wait(NULL) > 0)
                continue;
    printf("[PARENT=%d] terminates\n", getpid());
    return EXIT_SUCCESS;
}

当前问题实际上是处理父进程。由于我不明白的原因,我的第二个孩子没有被创建。而且,正在印刷的父母是不可能的。

[6025] PARENT started! My parent: 1300
[6026] child created!
[6026] sending SIGUSR1 to 6025
[6026] sending SIGUSR1 to 6025
[6026] sending SIGUSR1 to 6025
[6026] sending SIGUSR1 to 30404
[6026] sending SIGUSR1 to 30404

这是完整的输出。请帮我理解这里发生的事情......

1 个答案:

答案 0 :(得分:1)

请注意,在childWork()返回之前,您不会报告创建子项2。

但是,您的基本问题是在if (pid == 0)之后缺少语句分组大括号,这意味着在exit(EXIT_SUCCESS):if (i == 1)之后if (i == 2);导致父母在启动第一个孩子后立即退出。

int main(int argc, char** argv)
{
    printf("[%d] PARENT started! My parent: %d\n", getpid(), getppid());
    childrenLeft=2;
    setHandler(handleZombie,SIGCHLD);
    setHandler(sigHandler1, SIGUSR1);
    setHandler(sigHandler2, SIGUSR2);
    int i;
    for(i=1;i<=childrenLeft;i++)
    {
        pid_t pid = fork();
        if(pid < 0)
            printf("Error - fork\n");
        if(pid==0)
        {   // Primary bug: braces missing
            if(i==1)
            {
                printf("[%d] child created!\n", getpid());
                childWork(5,SIGUSR1);
            }
            if(i==2)
            {
                printf("[%d] child created!\n", getpid());  // Moved before childWork()
                childWork(8, SIGUSR2);
            }
            exit(EXIT_SUCCESS);    // Only executed by children
        }   // Primary bug: missing braces
    }

    printf("Work finished, final numbers:\nSIGUSR1 received: %d\nSIGUSR2 received: %d\n",sig1Count,sig2Count);
    while (wait(NULL) > 0)
                continue;
    printf("[PARENT=%d] terminates\n", getpid());
    return EXIT_SUCCESS;
}

这是所需的最低限度;还有许多其他变化可以并且可能应该进行。