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

此C代码使用fork()生成输出的帮助,c,fork,C,Fork,我试图用fork()来计算C代码块的输出,但在理解为什么会这样时遇到了一些问题。我知道当使用fork()时,它会并行启动程序的另一个实例,并且子实例将返回0。有人能一步一步地解释下面代码块的输出吗?多谢各位EDIT:我忘记在FOR循环之后添加出口(1)。很抱歉。 main() { int status, i; for (i=0; i<2; ++i){ printf("At the top of pass %d\n", i);

我试图用fork()来计算C代码块的输出,但在理解为什么会这样时遇到了一些问题。我知道当使用fork()时,它会并行启动程序的另一个实例,并且子实例将返回0。有人能一步一步地解释下面代码块的输出吗?多谢各位EDIT:我忘记在FOR循环之后添加出口(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);
}
main(){int status,i;

对于(i=0;i此代码可能很难解释。原因是第一个子级没有退出,并且将自己调用fork。请尝试修改代码以在每个打印行中包含进程id,例如:

printf("At the top of pass %d in pid %u\n", i, getpid());

然后注意子进程如何成为父进程…

在第一个循环中发生的是第一个进程分叉。在其中一个循环中,
fork()
返回0,在另一个循环中,它返回子进程的pid,因此您将得到一个输出“thisachild”的循环和一个输出“thisaparent”的循环。这两个进程都在循环中继续,分别将
i
增加到1和
fork()
。现在您有了四个进程:两个子进程和两个父进程。所有四个进程都将
i
增加到2,并脱离循环


如果你将循环终止条件增加到
i…那么结果如何?为什么不告诉我们输出以及它的混淆之处。你运行了吗?因为这是一个测试程序,我会这样做作为第一步。当你查看输出时,你可以很容易地推断出发生了什么,不是吗?第一个条件不应该读取吗:
if((status=fork())==0){
相反-所以等待实际上是在等待父进程的PID?我想说的是,我想在运行它之前预测输出。Hrm。我想我分别计算3和6。也许我需要自己实际运行代码…一个小错误。这两个进程在循环中继续是不完全正确的;因为父进程调用wait时,只有子循环继续;该特定fork的父循环在子循环退出之前不会继续。啊,第二次运行时为7。但我明白了原因。@R Samuel Klatchko:哦,你说得对,我没有注意到
wait()
。因此,在第一个循环中,当它分叉时,它不等于零,因此它转到else并等待。现在在由分叉创建的新进程中,它到达fork()==0,这应该是零对吗?因为它是子循环?它会先打印“this is a child”还是返回到第一个循环并使其打印“this is a parent”然后它会打印“This is a child”?然后这两个进程会再次通过循环,每个进程都会分叉?编辑:还是等待(&status)等待子进程退出?