我有这段代码:
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
在第一个 child 中失败,因此它打印L1 End
。 - 第一个
if
传入父级,随后的输出将包含L2
。 - 第二个
if
在第二个 child 中失败,所以它打印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
关于c - 在 if 语句/管理进程中使用 fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800437/