查找分叉时的进程数

时间:2015-02-10 04:35:11

标签: unix fork system-calls

我正在阅读这些操作系统书籍,他们谈论的是在UNIX机器上分叉。我知道fork()是一个系统调用,它创建了一个进程的副本(一个父进程和一个子进程)。让我们说下面的代码:

1 int main(){
2  pid = fork ();
3  if (pid !=0)
4     fork();
5  fork();

当PID为0时,我们处于子进程中,如果没有,那么我们是在父进程中吗?所以上面的代码执行如下(第2行):

    P0
    /\
   P0 P1

由于P1不是0,那么我们执行第4行 - 然后我们执行第5行,这意味着P0被分叉

    P0
  /    \
 P0     P1
 /\    /  \
P0 P2  P1 P3

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

感谢

更新:这不是一个功课问题,因为我已经声明结果应该是6个过程,我只是不明白这本书是如何得到这个答案的

1 个答案:

答案 0 :(得分:0)

您的代码应创建总共6个进程。

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


共6个过程= PM + PC1 + PC2 + PCC1 + PCC2 + PCCC1


画画:

 
        PM
      /    \
    PC1    PC2
    (@2)   (@5)
   /    \
PCC1 PCC2 (@4) (@5) / PCCC1 (@5)

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