在if语句/管理进程中使用fork

我有这段代码:

printf("L1 "); if(fork() != 0) { printf("L2 "); if(fork() != 0) { printf("L3 "); fork(); } } printf("End \n"); 

作为练习,我试图找出运行此代码(无需实际运行)导致的有效/无效输出的一些示例。

我仍然对fork()方法在if语句中的工作方式有点困惑。 我知道一旦它被调用它会返回两次,表明它已经创建了两个进程。所以,如果我做了类似的事情,

 printf("L1 "); fork(); printf("L2 "); 

我会得到L1 L2 L2

但是我仍然不知道如何在第一段代码中的语句中工作。

以下是我认为的一些有效/无效输出:

 Valid: L1 L1 L2 L1 L2 L3 L1 L2 L1 Invalid: (Anything hat doesn't start with L1) L1 L2 L2 L1 L3 L2 

这些有意义吗? 有没有一种简单的方法来解释if语句中发生的事情,以便我可以大致了解fork()在它们中的工作原理? 这些输出值是正确/不正确的吗?

如果fork()调用全部失败,那么只有一个进程,因此它将打印:

 L1 L2 L3 End 

如果每个fork()调用成功,则:

  1. 假设行缓冲或完全缓冲输出,
  2. 将有4批打印输出,但它们的顺序是不确定的,并且可能(但可能不会)在输出上交错。
  3. 每个输出将以L1开始,以End
  4. fork()返回非零值时,它是父进程。
  5. 第一个if在第一个子节点失败,则打印L1 End
  6. 第一个if传入父级,后续输出则包含L2
  7. 第二个if在第二个子节点失败,则打印L1 L2 End
  8. 第二个if传入父级,后续输出则包含L3
  9. 第三个fork()创建两个进程(或创建一个进程并在父进程中继续),两个进程都打印L1 L2 L3 End

因此,输出将包括:

 L1 End L1 L2 End L1 L2 L3 End L1 L2 L3 End 

但序列不保证。


发布上面的分析后,我通过运行它来检查它,并生成第一个样本运行:

 L1 End L1 L2 L3 End L1 L2 End L1 L2 L3 End 

请注意,如果输出是非缓冲的,则输出不同。 L1会出现一次; L2将出现一次; L3将出现一次; 和End将出现四次。

一个可能的顺序是:

 L1 L2 End L3 End End End 

另一个观察到的序列(两次运行中的第二次)是:

 L1 L2 L3 End End End End 

在您的代码中,每个fork的子进程直接进入printf("End") 。 只有父级将打印L1L2L3 ,因此它们将按顺序打印一次。 混合输出将是子项的End (以及父项的最终结束)。