处理层次结构

时间:2018-02-18 17:31:38

标签: c fork

我有一个关于fork()和exit()的问题,以准备考试。 在以下代码中,生成了多少个进程以及它们的层次结构(父/子)是什么?

int i;
pid_t f;
for(i=0; i<3; i++){
  f = fork();
  if(f==0) exit(0);
  f = fork();
  if(f > 0) exit(0);
}  

我认为创建的总进程数等于6,但最后的总进程数等于1而剩下的进程是一个孩子,我是对还是不对?

1 个答案:

答案 0 :(得分:1)

int i;
pid_t f;
for(i=0; i<3; i++){
  f = fork();
  if(f==0) exit(0);
  f = fork();
  if(f > 0) exit(0);
}

让我们画一幅画

P: first parent
i = 0;

+---+
| P |
+---+
  | fork()    +----+   exits
  |---------> | C1 |  ----> because of (if==0) exit(0)
  |           +----+
  |
  | fork()    +----+
  |---------> | C2 |
  |           +----+
  |             |  next loop
  |             |  i = 1, C2 is the only surviving
  |             |  process, it becomes the new parent P
  |             v
  v             repeat same graph where P == C2
 exits
 because of
 if(f > 0) exit(0)

每次迭代都会创建2个孩子,父P和第一个孩子C_1退出, 第二个孩子C_2幸存下来。下一次迭代也是如此,新的parant就是 第一次迭代C_2的第二个子节点,它还将创建两个新子节点: C_2_1C_2_2C_2C_2_1退出,C_2_2幸存。下一个 迭代也是如此,C_2_2创建了两个孩子:C_2_2_1C_2_2_2C_2_2C_2_2_1退出,C_2_2_2幸存。循环结束:

  • 创建了6个孩子:C_1C_2C_2_1C_2_2C_2_2_1C_2_2_2
  • 从这些孩子C_2C_2_2创建了新的孩子
  • 共3个父进程,1个外祖(P)和两个父母(C_2C_2_2)。

没有评论的图表

+---+
| P |  i == 0
+---+
  |      +-----+
  |----> | C_1 | --> exit
  |      +-----+
  |
  |      +-----+
  |----> | C_2 |  i == 1, new Parent
  |      +-----+
  v         |       +-------+
 exit       |---->  | C_2_1 | --> exit
            |       +-------+
            |
            |       +-------+
            |---->  | C_2_2 | i == 2, new Parent
            |       +-------+
            |           |        +---------+
            |           |------> | C_2_2_1 | --> exit
            v           |        +---------+
          exit          |
                        |        +---------+
                        |------> | C_2_2_2 | i == 3, ends loop
                        |        +---------+
                        |
                        v
                      exit