这里分叉了多少个进程

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

//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不再产生任何进程。 我的意思是子进程是父进程的精确副本(至少在代码中),因此它必须完整地执行其父进程的代码。 任何人都可以帮助我解决这个困惑……

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

编辑重新评论以回应评论。 有关所有返回值的含义,请参见fork(2)手册页 。

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

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

很简单,并行有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下面的所有代码都是父进程和子进程。

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

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

就像@Mat说的那样,创建了8个进程。