使用fork()帮助使用此C代码生成的输出

时间:2010-04-13 00:00:16

标签: c fork

我正在尝试使用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);
}

2 个答案:

答案 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());

然后注意孩子如何成为父母......