我知道这可能是一个愚蠢的问题,但任何人都可以帮助我理解以下代码段的行为
//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不再产生任何进程。我的意思是子进程是父进程的精确副本(至少在代码中),因此它必须完整地执行其父进程的代码。任何人都可以帮助我解决这个困惑......
答案 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()
用于这两个进程。所以流程1c
,2c
,3c
,p
。
所以在第三次fork()
调用之后你会得到8个进程。
fork之后,新进程在分叉的代码之后执行。所以fork下面的所有代码都是父进程和子进程。
答案 3 :(得分:0)
进程树如下所示。我对进程使用了以下命名约定。将父进程名称加到创建它的相应fork标签上。
[0]
/ | \
[01] [02] [03]
/ \ |
[012] [013] [023]
/
[0123]
就像@Mat所说,创建了8个进程。