fork()如何在这里工作?

时间:2016-09-20 12:30:57

标签: operating-system fork parent-child

{ 
    if(fork() && fork()) 
    { 
        fork(); 
    } 

    if(fork() || fork()) 
    {
        fork();
    } 

    printf("hello"); 
    return 0; 
} 

我不知道fork()在这里的行为以及打印你好的次数。
我只知道fork() && fork()将为1个父级生成总共3个进程,同样,fork() || fork()将为1个父级生成3个进程。

在第一个if条件之后,创建了3个进程,只有父进程才会进入if块。现在共有4个流程。现在,如何进一步,我完全搞砸了?

如果可能,请显示树形图。

2 个答案:

答案 0 :(得分:3)

对于第一块:

if(fork() && fork()) 
{ 
    fork(); 
}

子进程收到0并跳过if,父进程继续计算条件。父执行下一个fork并再次进入if块。所以我们有3个fork调用,导致4个进程。

然后,这4个进程中的每一个都执行下一个块。让我们看一下:

if(fork() || fork()) 
{
    fork();
} 

我们分叉一次。孩子收到非0并且条件结果已经为真,所以它进入if而不评估条件的第二部分并在那里分叉。所以我们已经有2个fork调用。父进程必须在表达式中计算第二个fork,并且它的子进程再次输入if和forks。所以还有2个fork调用。总计4次调用导致5个正在运行的进程。

因此,从第一个块中的4个进程中的每一个进入第二个块中的5个进程,导致总共4 * 5 = 20个进程。每一个都打印出来"你好"。

答案 1 :(得分:2)

树形可视化!

if(fork() && fork()) 
{ 
    fork(); 
}

First if block

现在我们在系统中运行了4个进程; P C1 C2 C3

如果阻止,每个将执行next。

if(fork() || fork()) 
{ 
    fork(); 
}

Second if block

总的来说,我们将在系统中运行 4 * 5 = 20 进程,每个进程都会打印" Hello"。