我正在尝试使用fork()来计算一个C代码块的输出,并且我在理解它出现的方式时遇到了一些问题。我理解当使用fork()时,它会并行启动另一个程序实例,并且子实例将返回0.有人可以逐步解释输出到下面的代码块吗?谢谢。 编辑:我忘了在退出之后添加退出(1)。我的朋友。
main() { int status, i;
for (i=0; i<2; ++i){
printf("At the top of pass %d\n", i);
if (fork() == 0){
printf("this is a child, i=%d\n", i);
} else {
wait(&status);
printf("This is a parent, i=%d\n", i);
}
}
exit(1);
}
答案 0 :(得分:1)
第一个循环中发生的是第一个进程分叉。在一个中,fork()
返回0而在另一个中它返回子进程的pid所以你将得到一个打印出“这是一个孩子”的一个,并打印出一个“这是一个父”。这两个过程都会继续循环,再次增加i
到1和fork()
。现在你有四个过程:两个孩子和两个父母。所有四个进程都会将i
增加到2并且不会出现循环。
如果您将循环终止条件增加到i<3
,则下一次循环循环时,所有四个进程将执行fork()
,并且您总共有八个进程。如果循环中没有限制,那么你将拥有一个fork bomb,你只需要在每个循环中以指数方式创建越来越多的进程,直到系统资源耗尽为止。
答案 1 :(得分:0)
这段代码解释起来很棘手。原因是第一个孩子没有退出并且本身会调用fork。尝试修改代码以在每个打印行上包含进程ID,例如:
printf("At the top of pass %d in pid %u\n", i, getpid());
然后注意孩子如何成为父母......