#include <stdio.h>
#include <sys/type.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
pid_t pid;
int i;
for(i=0; i<3; i++) {
pid = fork();
if(pid == -1) {
printf("Fork Error.\n");
} else if(pid == 0) {
printf("I am child");
}
}
if(pid != 0) {
while((pid = waitpid(-1, NULL, 0)) > 0)
if(errno == ECHILD)
break;
printf("I am parent and all children have exited.\n");
}
exit(0);
return 0;
}
结果是:
'我是孩子'打印了7次,'我是家长,所有的孩子都退出了'打印了4次。
而且打印顺序也不固定。
我想明白了一些我一直在纠结的问题,但有些问题还没有解决。所以,这里是。
为什么 "我是家长,所有的孩子都退出了。"打印了4次?
你能详细解释一下吗?
PS. 我知道syswait.h需要插入到代码的顶部,但我的老板不希望我这样做。
你在一个循环中进行fork,基本上你的子进程会继续执行它们开始的循环。所以在下一次迭代时,他们可能会达到一个fork,并创建自己的子进程。
如果你在循环中插入一个 break;
紧接着 printf("I am child");
当你刚刚创建一个子进程时,退出循环,让父进程继续创建更多的子进程,你可能会得到一些接近你预期的东西。