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

问题描述 投票:1回答:2

我正试图追踪这个程序。我看到它在运行时输出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语句再次分叉,我们不是在另一个孩子吗?
  • 孩子什么时候停止产生?
c fork system system-calls
2个回答
3
投票

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

第一个fork将生成一个孩子(我们称之为c1):

if (fork() == 0)

当你在孩子的时候,fork的返回值是0。所以,c1将执行if语句块:

fork();

在这里创建的子项c2(以及c1)都会死掉,因为它们不会执行else块。


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

fork();

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

fork();

现在,我们也将拥有c4。


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

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


1
投票
  1. forkif被执行。现在有两个进程子C1和父进程。父获得非零数字。孩子得到0
  2. 父进入其他区块,因为它从fork获得非零回报。现在再次有两个进程子C2和父进程 - 在else块中执行fork之后。
  3. 父母再次与C3分叉。
  4. 儿童C2再次用C4拨打。
  5. 请注意,C1也是分叉但除了结束if块之外它不会做任何事情。 (我们不关心这个)。

所以4printf执行 - 一个由父母,C2C3C4

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

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

当控件到达function的末尾时,每个过程结束,这里是main()。 (回答你的上一个问题)。

© www.soinside.com 2019 - 2024. All rights reserved.