这是创建的子进程的正确数量吗?

Would this be the correct number of child processes created?

我知道总数了。创建的子进程数是 6,但我不太确定这是否正确。如果不正确,有人可以指出我正确的方向。我插入了一个粗略的草图,说明我是如何收到答案的。

void main() {
  int pid = fork();
  if(pid == 0)
    fork();
  pid = fork();
  if(pid != 0)
    fork();
  exit(0);
}

你最终应该有 9 个进程。

int main() {            //  |
  int pid = fork();     //  +-----+
  if(pid == 0)          //  |     |
    fork();             //        +-----+
  pid = fork();         //  +---+ +---+ +---+
  if(pid != 0)          //  |   | |   | |   |
    fork();             //  +-+   +-+   +-+
  return 0;             //  | | | | | | | | |
}

int pid = fork(); 中,您将进程数量加倍,其中一种情况是 pid == 0,另一种情况是 pid != 0。其中一个在两行之后再次翻倍。所以在第一部分之后你总共有 3 个进程。

pid = fork(); 开始,它不会判断进程是父进程还是子进程,因为您重新分配了 pid。在第 2 部分中,您再次将总量增加三倍,因此总共有 9 个流程。

其中 3 个 pid = fork(); 返回了 0,其中 6 个(来自这一行和最后 fork() 的子进程)有 pid != 0.

我在 main() 的末尾添加了 pause():

#include <unistd.h>
#include <stdlib.h>

void main(void) {
  int pid = fork();
  if(pid == 0)
    fork();
  pid = fork();
  if(pid != 0)
    fork();
  pause();
  exit(0);
}

我编译执行了。在另一个终端中,我使用了 pstree:

$ pstree -p -h 11052
a.out(11052)-+-a.out(11053)-+-a.out(11056)-+-a.out(11058)
             |              |              `-a.out(11060)
             |              |-a.out(11057)
             |              `-a.out(11059)
             |-a.out(11054)
             `-a.out(11055)