控制多个孩子,处理sigchld

时间:2014-05-05 10:59:16

标签: c unix signals wait

假设我有一个主要的C程序,必须等待两个孩子的sigchld,并且这两个儿子必须做两个单独的任务,例如一个应该写“1”,另一个 一个人应该写“2”,等待2秒然后终止,现在我应该如何编写代码,以便父亲只有在两个儿子以sigchld结束后才能写出他孩子的pid?很明显,我错过了一些理论,如果你查看我的代码,你就会明白我的问题是什么。

之后,我将不得不在第一个儿子之前强行执行第二个儿子,建议?

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>


int main(int argc, char **argv)
{
    int pids[2], cpid, i, status;
    char buff[200];

    for(i=0; i < 2; i++)
    {
        if ((pids[i] = fork()) < 0) 
            perror("errno");
        else
        {
            //child
            if (pids[i] == 0)
            {       
                if(i == 0)
                    write(1,"1\n", 2);          
                else
                {
                    sleep(2);
                    write(1,"2\n", 2);
                }

                return 0;           
            }
        }
    }       

    for(i = 0; i < 2; i++)
    {
        cpid = waitpid(pids[i], &status, 0);

        if (WTERMSIG(status))
            printf("status:%d , pid terminated:\n", status,cpid);
        else
            printf("error: not exited with a signal\n");

    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果最后一个for循环更改为:

for(i = 0; i < 2; i++)
{
    cpid = waitpid(pids[i], &status, 0);

  if (WIFEXITED(status))
        printf("status:%d , pid %d terminated normally :\n", status,cpid);
    else if (WTERMSIG(status))
        printf("status:%d , pid %d terminated by signal:\n", status,cpid);
    else
        printf("error: not exited with a signal\n");

}

然后事情会更好,因为没有信号来终止孩子。