为什么分叉时 pid0 会打印两次并带有一个值?

Why does pid0 get printed twice with a value when forking?

我很难理解为什么变量 pid0 使用实际 ID 打印了两次。据我了解,第一次后所有分叉进程的 pid0 都将设置为 0。

这是我的主要功能:

int main() {
  pid_t pid0, pid1, pid2;

  pid0 = fork();
  pid1 = fork();
  if (pid0 == 0) pid2 = fork();

  printf("pid0: %d, pid1: %d, pid2: %d\n", pid0, pid1, pid2);

  return 0;
}

这是输出:

pid0: 3388, pid1: 3389, pid2: 32766
pid0: 3388, pid1: 0, pid2: 32766
pid0: 0, pid1: 3390, pid2: 3391
pid0: 0, pid1: 0, pid2: 3392
pid0: 0, pid1: 3390, pid2: 0
pid0: 0, pid1: 0, pid2: 0

您的第一个 fork() 创建了第二个进程。你的第二个运行在两个进程上,然后你有四个进程。其中两个 pid0 设置为 0,另外两个没有。

原来的分叉进程 (pid0 === 0) 及其克隆都将再次调用 fork(),因此还有两个进程,总共六个。

这四颗是原fork()树的一部分,还有两颗也在二级树中(pid1 == 0)。

如果您只需要一个父进程,则必须关闭第二个 fork() 并在 pid0 非零时避免这样做。

请注意输出的第二行有 pid1: 0,表明它是一个克隆。

fork之后,父子都继续执行下面的代码。

让我们调用原始进程P,以及用pid0 = fork()创建的子进程P-C1。然后这两个进程都执行 pid1 = fork()。然后我们还有两个进程,我称之为 P-C2P-C1-C3.

现在所有 4 个进程都执行 if 语句。 pid0P-C1P-C1-C3中都是0,所以他们都执行pid2 = fork()。这将创建进程 P-C1-C4P-C1-C3-C5,并且它们继承了 pid0.

的零值

完成所有这些后,我们在进程 P-C1P-C1-C3P-C1-C4P-C1-C3-C4 中有 pid0 = 0。并且 pid0 != 0 在进程 PP-C2 中。

所有 6 个进程然后打印 pid0