我希望简单而优雅的解决方案让父进程等待他的所有孩子。 我有以下代码,但它不是我想要的工作,我不知道为什么。有人可以向我解释,为什么?
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选项对我不起作用?
答案 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
进程,然后才开始收集其退出状态。完成等待后,将打印正确的信息。