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