一个 fork() 的输出

3

我有以下代码:

int main(){
  if (fork() + fork())
     printf("Boom!\n");
  return 0;
}

我不理解为什么这段代码会打印三次消息。

有人能给我解释一下吗?


它应该打印多少次? - Sergey Kalinichenko
3
你有一个主进程,它会复制自己两次。这难道不清楚吗? - andreee
第二个fork()让我感到困惑。这之后我们有4个进程?只有2个进程的ID是0? - Mickey
2个回答

5

Fork函数对于父进程返回非零值,对于子进程返回0。

所以父进程首先进行一次fork调用,创建一个子进程(fork1)。这个子进程会再次进行一次fork调用(执行第二个fork)(fork2),创建第二个子进程。然后父进程在第二次fork调用上进行fork,创建第三个进程(fork3)。因此,我们将得到如下的树形结构:

           Parent
  fork1            fork3
       fork2

现在请注意,对于子进程,fork之前执行的所有调用的值都来自父进程。如果我们使用这个,我们会得到以下结果:
  • Parent将具有非零返回值,因为两个fork()调用都返回非零值
  • fork1将具有非零返回值,因为最后一个fork返回非零值
  • fork2将具有零返回值,因为第一个fork是零(这是从fork1继承的),而第二个fork也将返回零(fork2是在第二个fork中创建的)。
  • fork3将具有非零返回值,因为它继承了来自Parent的第一个fork值。
fork() + fork()不为零时,if语句将被执行。因此,会发生三次“boom”!

你确定父进程的返回值是零,而子进程的返回值是非零吗?在手册中恰恰相反。 - Mickey

2

请执行以下测试:

int main() {
    pidsum = fork() + fork();
    printf("%d", pidsum);
}

创建了4个线程。 0用于父线程。
1用于3个子线程。 这3个子线程具有不同的PID。
- Mickaël P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接