Unix 查找分叉时的进程数

Unix 查找分叉时的进程数,unix,fork,system-calls,Unix,Fork,System Calls,我在读这本操作系统书籍,他们在谈论UNIX机器中的分叉。我知道fork()是一个系统调用,它创建进程的副本(一个父进程和一个子进程)。假设有以下代码: 1 int main(){ 2 pid = fork (); 3 if (pid !=0) 4 fork(); 5 fork(); 当PID为0时,则我们处于子进程中,如果不是,则我们处于父进程中,对吗?因此,上面的代码执行如下(在第2行中): 因为P1不是0,所以我们执行第4行-然后执行第5行,这意味着P0得到分叉 P0

我在读这本操作系统书籍,他们在谈论UNIX机器中的分叉。我知道
fork()
是一个系统调用,它创建进程的副本(一个父进程和一个子进程)。假设有以下代码:

1 int main(){
2  pid = fork ();
3  if (pid !=0)
4     fork();
5  fork();
当PID为0时,则我们处于子进程中,如果不是,则我们处于父进程中,对吗?因此,上面的代码执行如下(在第2行中):

因为P1不是0,所以我们执行第4行-然后执行第5行,这意味着P0得到分叉

    P0
  /    \
 P0     P1
 /\    /  \
P0 P2  P1 P3
所以创建的进程总数是:P0,P1,P2,P3,4个进程?这本书说,这是六个过程,但没有迹象表明这是如何做到的

谢谢


更新:这不是家庭作业问题,因为我已经说过结果应该是6个进程,我只是不明白这本书是如何得到这个答案的,你的代码应该创建总共6个进程。

  • 主进程(比如PM)将执行第1行到第5行的代码,其中包括两个fork(@第2行和第5行),因此生成两个子进程,比如PC1和PC2
    {fork@第4行将仅由子进程执行,而不是由主进程执行}
  • 在第2行(比如PC1)创建的子进程执行第3行到第5行的代码,其中包括2个分叉(@line 4和5),因此生成两个子进程,比如PCC1和PCC2
  • 在第4行创建的子进程(比如PCC1)在第5行执行代码,这是fork,因此会生成一个子进程(比如PCCC1)
共6个过程=PM+PC1+PC2+PCC1+PCC2+PCCC1


图纸:
颗粒物 / \ PC1 PC2 (@2) (@5) /\
PCC1 PCC2 (@4) (@5) / PCCC1 (@5)

注意:由于只有if语句(而不是if-else),fork@line 5将由主进程和两个子进程调用

该代码有3个分叉行。试着在你的图纸上画线号。@hyde我在图纸上画了3次叉,对吗?显然不对,因为当正确的结果是6时,你在图纸上画了4个过程(据我所知,这确实是正确的)
    P0
  /    \
 P0     P1
 /\    /  \
P0 P2  P1 P3
PM / \ PC1 PC2 (@2) (@5) / \
PCC1 PCC2 (@4) (@5) / PCCC1 (@5)