fork() 函数在这个程序中是如何工作的?

How fork() function works in this program?

我在使用这个程序时遇到了一些问题。我知道 fork() 函数的作用。它用于从现有流程创建新流程。新进程称为 child 进程,现有进程称为 parent。 parent 返回 child 的 pid 而 child returns 0。也就是说,我很难理解这两个 fork 函数在这个程序中的作用。

#include <unistd.h>
#include <stdio.h>

int main()
{
    int i,y,x=1;
    for (i=0;i<4;i++)
        if(x && fork())
        {
            y = i;
            x = 0;
        }
    if (x) y = i;
    fork();
    printf("%i\n",y);
}

原进程在进入循环的if时开辟一个进程。 child 没有进入 if 因为 fork() == 0。现在parent有x == 0,不再进入后面的迭代'ifs(短路&&防止forks)。

注意: 短路 if(x && fork()) 防止分叉两次,因为 x == 0 => 不需要评估 fork() (对所有进程都是如此分叉一次)。分叉一次的进程永远不会进入循环的 if 因为从那一点开始 x == 0

你得到的是每个循环值两次,因为每个新进程都会在下一次迭代和打印之前在循环外分叉一次。对于循环中的每个派生进程,除了第一个之外没有分叉。

#include <unistd.h>
#include <stdio.h>

int main()
{
    int i,y,x=1;
    for (i=0;i<4;i++)
        if(x && fork()) // only un-forked process (x=1) executes fork()
        {
            // only parent process (fork() != 0) execute this
            y = i;
            x = 0;
        }
    if (x) y = i; // set up i=4 for last forked process (has x=1)
    fork();
    printf("%i\n",y);
}

进程生成过程看起来像这样:

提示: 调查此类代码时,您可以添加输出语句 (printf) 或使用调试器。

首先声明:fork 不会失败。那不是真的,而是更简单

if (x && fork()) -> 如果 x == 1 且 fork return 为父亲则为真 然后是假的。 所以 child 也会创建一个 child (除了最后一个)但是 父亲刚刚创造了一个 child.

循环后你有 1 + 4 个新进程。 这 5 个进程执行最后一个 fork(),你有 10 个进程。

由于任务的调度,输出结果是不确定的。

实际上你可以从这个程序中学到一些东西,当你查看分叉的 pids return 并据此估计,哪个分叉产生什么输出:

#include <unistd.h>
#include <stdio.h>

int main()
{
    int i,y,x=1;
    pid_t p,c;
    for (i=0;i<4;i++)
        if(x && 0 != (p=fork()))
        {
            y = i;
            c = p;
            x = 0;
        }
    if (x) y = i;
    p=fork();
    printf("%i %d %d\n",y, p, c);
}

例如我得到这个输出:

0 24413 24412
0 0 24412
2 24417 24416
1 24415 24414
1 0 24414
3 24419 24418
2 0 24416
3 0 24418
4 24420 0
4 0 0

第一行是第一个child的child,下一行是第一个child本身,依此类推。最后一行是 parent.

想一想,您就可以了解 fork 的工作原理。

错误,抱歉,我完全错了,几乎:将 return 的正 pid 分叉到 parent,当然不是 child。所以 p 和 c 为正的每一行都是 parent 等等。剩下的就交给你了。