首页 > 解决方案 > 为什么 pid0 在分叉时会打印两次并带有一个值?

问题描述

我很难理解为什么变量 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

标签: cfork

解决方案


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

原来的分叉进程 ( pid0 === 0) 和它的克隆都将fork()再次调用,所以还有两个进程,总共六个。

这四个是原始fork()树的一部分,两个也在辅助树中(pid1 == 0)。

如果您只想要一个父进程,则必须对第二个父进程进行门控,如果非零fork()则避免这样做。pid0

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


推荐阅读