有人可以帮我理解这部分代码中发生了什么吗?我无法理解为什么输出是这样的。输出是:
0 1 2 3 4
3
2
1
0
int main() {
int i;
for (i = 0; i < 5 && !fork(); i++) {
fflush(stdout);
printf("%d ", i);
}
wait(NULL);
printf("\n");
return 0;
}
答案 0 :(得分:2)
这里有两件事:
首先,fork()
在子进程中返回0
,同时向父进程返回非零pid。
第二,&&
的短路。
所以在第一个进程(p0)的开头,它运行到i < 5 && !fork()
。现在i = 0
和另一个进程创建(p1)。现在对于p0,测试!fork()
失败,它结束for循环并等待子节点结束。对于p1,测试成功,打印出0
,然后将i
增加到1,然后它将创建进程p2,并且它本身会像p0那样离开for循环。
由于短路,当i
等于5时,将不再调用fork
。