在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()
调用成功,则:
- 假设行缓冲或完全缓冲输出,
- 将有4批打印输出,但它们的顺序是不确定的,并且可能(但可能不会)在输出上交错。
- 每个输出将以
L1
开始,以End
。 - 当
fork()
返回非零值时,它是父进程。 - 第一个
if
在第一个子节点失败,则打印L1 End
。 - 第一个
if
传入父级,后续输出则包含L2
。 - 第二个
if
在第二个子节点失败,则打印L1 L2 End
。 - 第二个
if
传入父级,后续输出则包含L3
。 - 第三个
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")
。 只有父级将打印L1
, L2
, L3
,因此它们将按顺序打印一次。 混合输出将是子项的End
(以及父项的最终结束)。