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

时间:2015-07-02 21:19:05

标签: c linux ubuntu process fork

我在这个程序上遇到了一些麻烦。我知道fork()函数的作用。它用于从现有流程创建新流程。新进程称为子进程,现有进程称为父进程。父母返回孩子的pid并且孩子返回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);
}

3 个答案:

答案 0 :(得分:1)

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

if(x&amp;&amp; fork())    - &GT;如果x == 1并且fork返回父亲,则为true      然后是假的。 所以孩子也会创造一个孩子(除了最后一个孩子),但是 父亲只是创造了一个孩子。

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

由于任务的安排,输出结果不确定。

答案 1 :(得分:0)

原始流程在进入循环if时会打开一个流程。自if以来,孩子未输入fork() == 0。现在,父级已x == 0,并且不再进入以下迭代'if s(短路&&阻止fork s。)

注意:短路if(x && fork())可防止因x == 0 =&gt;而分叉两次无需评估fork()(对于分叉一次的所有进程都为true)。分叉的进程永远不会进入循环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);
}

流程产生过程看起来像这样:

Forking a process and right before the last print

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

答案 2 :(得分:0)

实际上你可以从这个程序中学到一些东西,当你看到叉子返回的pid并从中估计出来时,哪个fork会产生什么输出:

#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

第一行是第一个孩子的孩子,下一行是第一个孩子本身,依此类推。最后一行是父母。

仔细考虑,你可以了解fork是如何工作的。

呃,对不起,我完全错了,差不多:fork给父母带来了正面的pid,当然不是给孩子。因此,具有正p和c的每一行都是父,依此类推。我让其他人为你解决。