在if / else块中跟踪具有多个forks的程序

时间:2018-03-02 10:31:40

标签: c fork system system-calls

我正在尝试追踪这个程序。我看到它在运行时输出4次,但我不明白为什么。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() 
{
    if (fork() == 0)
        fork();
    else 
    {
        fork();
        fork();
        printf("%d\n", getpid());
    }
}

据我所知,if / else会问我的程序,然后如果我们在孩子身上,它再次分叉。如果我们在父级中,它会在else块中运行代码。不过,当我尝试追踪这一点后,我感到困惑。

  • 一旦else语句再次分叉,我们不是在另一个孩子吗?

  • 这些孩子什么时候停止产生?

2 个答案:

答案 0 :(得分:3)

在向我解释之后,我现在明白了。

第一个分叉会产生一个孩子(让我们称之为c1):

if (fork() == 0)

当您在孩子身边时,fork的返回值为0。因此,c1将执行if语句块:

fork();

这里创建的孩子,c2(以及c1)都将死亡,因为他们不会执行else块。

同时,父进程将执行else块。

fork();

这会创建原始父进程的另一个子进程(c3)。 c3将执行else块中的下一个fork。

fork();

现在,我们也有c4。

同时,原始父进程仍然会有一个没有运行的分支。这将创建最终的子进程c5。

在运行结束时,将有4个打印:原始父进程,c3,c4和c5。

答案 1 :(得分:1)

    执行fork中的
  1. if。现在有两个进程子C1和父进程。父获得非零数字。孩子得到0

  2. 父进入其他区块,因为它从fork返回非零值。现在再次有两个进程子C2和父进程 - 在else块中执行fork之后。

  3. 父母再次使用C3。

  4. 儿童C2再次使用C4拨打。

  5. 请注意,C1也是分叉但除了结束if块之外它不会做任何事情。 (我们不关心这个。)

  6. 所以4printf执行 - 一个由家长,C2C3C4执行。

    关键的一线黄金法则是: -

      

    父系统和子系统进程在系统调用fork()后立即开始执行

    当控件到达function的末尾时,每个进程都会结束main()。 (回答你的上一个问题)。