这里分叉了多少个进程

时间:2012-12-05 19:03:42

标签: c process fork

我知道这可能是一个愚蠢的问题,但任何人都可以帮助我理解以下代码段的行为

//label 0
int main(){
  fork();//label 1
  fork();//label 2
  fork();//label 3
  return 0;
}

据我了解,进程树就像这样

              [0]
          /    |    \
        [1]   [2]   [3]
       /  \    |
      [2] [3] [3]
       |
      [3]

我是对的吗? 如果是这样的话,我很困惑为什么第二个fork不会产生对应于label 1 fork的进程,而第三个fork不再产生任何进程。我的意思是子进程是父进程的精确副本(至少在代码中),因此它必须完整地执行其父进程的代码。任何人都可以帮助我解决这个困惑......

4 个答案:

答案 0 :(得分:4)

是的,孩子是其父母的副本。它也继承了执行状态,包括父执行代码中的 where 。当父节点从第一个fork()返回子节点的PID(> 0)时,它的第一个子节点返回0然后继续到第二个和第三个分叉。孩子不会回到main()的顶部,它只是在创建它的fork之后继续。

编辑重新评论以回应评论。有关所有返回值的含义,请参阅fork(2) man page

答案 1 :(得分:3)

在第一个分支之后,您有两个进程。两者都击中了第二个分支,共创建了四个进程。

所有四个都击中了第三个分叉,所以你有八个进程。然后他们都退出了。

答案 2 :(得分:1)

很简单,并行共有8个进程。

p ----------------
|                 |          // first fork() 
1c-------         p -------   
|        |        |        |      // second fork()
2c---    1c---    3c---    p----  
|   |    |    |   |    |   |    |    // third fork()
4c  2c   1c   5c  6c  3c   7c   p  

您可以计算8的叶节点,总计8个进程。

说明:父p已调用fork() 2进程1c第一个子级和父级p。现在第二个fork()用于这两个进程。所以流程1c2c3cp。 所以在第三次fork()调用之后你会得到8个进程。 fork之后,新进程在分叉的代码之后执行。所以fork下面的所有代码都是父进程和子进程。

答案 3 :(得分:0)

进程树如下所示。我对进程使用了​​以下命名约定。将父进程名称加到创建它的相应fork标签上。

                [0]
          /      |      \
        [01]    [02]    [03]
       /  \       |
    [012] [013] [023]
     /
   [0123]

就像@Mat所说,创建了8个进程。