等待所有带waitpid选项__WALL的孩子

时间:2014-04-21 19:09:25

标签: c linux process fork wait

我希望简单而优雅的解决方案让父进程等待他的所有孩子。 我有以下代码,但它不是我想要的工作,我不知道为什么。有人可以向我解释,为什么?

pid_t pid;
for (int i = 0; i < N; i++) {
    if ((pid = fork()) == -1) 
       return -1; // error, returning from parent
    else if (pid == 0) {
        printf("child: %d\n", pid);
        exit(0); // child i has finished 
    }
    else if (pid > 0) {
        waitpid(-1, NULL, __WALL); // waiting for all children, clone or non-close
        printf("I'm parent. All children have finished.\n"); 
        return 0; // everything OK, returning from parent
    }
 }

我的输出是:

child: 0
I'm parent. All children have finished.
child: 1
I'm parent. All children have finished.
child: 2
and so on

我想要这个:

child: 0
child: 1
.
.
.
I'm parent. All children have finished.

为什么__WALL选项对我不起作用?

1 个答案:

答案 0 :(得分:2)

在您的代码中,在每个循环中,父进程正在创建子进程;子进程正在打印其消息,而父进程正在等待在重新进入循环之前收集此特定子进程的退出状态。像这样工作,i+1 - 在i - 子进程终止之前,不会创建子进程。

要查看您的预期,您的代码可能如下所示(尽管此处未使用__WALL选项):

pid_t pid;

for (int i = 0; i < N; i++) {
    if ((pid = fork()) == -1) 
       return -1; // error, returning from parent
    if (pid == 0) {
        printf("child: %d\n", i);
        exit(0); // child i has finished 
    }
}

for (i = 0; i < N; i++)
    waitpid(-1, NULL, 0); // waiting for all children

printf("I'm parent. All children have finished.\n");

在这种情况下,父进程将首先创建N进程,然后才开始收集其退出状态。完成等待后,将打印正确的信息。