我有以下代码:

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

我不明白为什么这段代码要打印3次消息。
有人能解释我吗?

最佳答案

fork对于父进程返回非零,对于子进程返回零。
因此父进程分叉,创建一个子进程(fork1)。这个子进程将再次分叉(它将执行第二个分叉)。创建第二个子进程。然后父进程将在第二个fork调用上fork,创建第三个进程(fork2)。我们将得到这样的树结构:

           Parent
  fork1            fork3
       fork2

现在注意,对于子进程,在fork从父进程继承之前执行的所有调用的值。如果我们用这个我们会得到:
fork3将有一个非零的返回值,因为两个Parent调用都返回一个非零的值
fork()将有一个非零值返回,因为最后一个fork返回一个非零值
fork1将有一个零返回值,因为第一个fork为零(这是从fork2继承的),第二个fork也将返回零(fork1在第二个fork中创建)。
fork2将有一个非零的返回值,因为它从fork3继承第一个fork值。
Parent为非零时,将执行if。就这样三次爆炸!是的。

10-04 14:14