分叉for循环澄清

时间:2016-09-23 18:16:22

标签: c linux function fork systems-programming

我已经在这里看到了很多关于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循环仍然只能确保父级可以创建子级吗?

5 个答案:

答案 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