我有这段代码:
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()如何在其中工作?这些输出值是正确/不正确吗?
答案 0 :(得分:1)
在您的代码中,每个分支的子代直接进入printf("End")
。只有父母会打印L1
,L2
,L3
,因此他们只会按顺序打印一次。与该输出混合的是子项的End
(以及父项的最终结尾)。
答案 1 :(得分:1)
如果fork()
调用全部失败,则只会有一个进程,因此会打印:
L1 L2 L3 End
如果每个fork()
来电都成功,那么:
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