我已经在这里看到了很多关于for循环分支的例子,但没有太多关于它如何做它的功能的澄清。让我们以How to use Fork() to create only 2 child processes?的答案为例,使用这个简单的例子。
for (i = 0; i < n; ++i) {
pid = fork();
if (pid) {
continue;
} else if (pid == 0) {
break;
} else {
printf("fork error\n");
exit(1);
}
}
我见过的大部分例子都遵循这种一般格式。但我不明白的是,这又如何阻止儿童进程分叉?根据我的理解,每个创建的孩子也必须经历这个循环。但是在for循环的最开始调用fork(),然后发生3次比较。有人可以解释一下,即使孩子们似乎调用了fork(),这个for循环仍然只能确保父级可以创建子级吗?
答案 0 :(得分:3)
孩子从fork
之后的行开始。 fork
为孩子返回0
。在您的示例中,孩子会从pid == 0
循环中进入break
区块和for
。
在fork
之后,子节点和父节点的所有内容完全相同(包括下一条执行指令和变量值)。唯一的区别是fork的返回值(0
为子节点,子节点的pid为父节点)。
答案 1 :(得分:2)
当fork
返回时,它实际返回两次:一次返回父级,一次返回子级。它向子节点返回0,并将子节点的pid返回给父节点。
if
块然后检测返回的进程。在父进程中,if (pid)
的计算结果为true,因此它执行continue
并跳转到循环的顶部。
在子进程中,if (pid)
求值为false,然后if (pid == 0)
求值为true,因此执行break
跳出循环。所以孩子不再做分叉了。
答案 2 :(得分:1)
但我不明白的是,这又如何防止儿童进程分叉?
fork()
在孩子中返回0。在您的示例代码中,这会导致子节点break
退出循环而不是执行另一次迭代,因此子节点实际上不会调用fork()
。
答案 3 :(得分:0)
检查Why does this program print “forked!” 4 times?后。这对我来说似乎很简单。
这又如何防止子进程分叉?
if (pid) {
continue;
}
您看到子项创建后,然后执行其代码并调用fork()
,它将成为该阶段的父,因此pid
将为0。
答案 4 :(得分:0)
尝试man 2 fork
. Fork(2)为父级和子级返回不同的值,父级获取pid
,子级获得0
。