C 在if语句中使用fork/管理进程
我有一段代码:C 在if语句中使用fork/管理进程,c,fork,C,Fork,我有一段代码: printf("L1 "); if(fork() != 0) { printf("L2 "); if(fork() != 0) { printf("L3 "); fork(); } } printf("End \n"); 作为练习,我试图找出运行此代码(而不是实际运行它)将导致的有效/无效输出的一些示例 我仍然对fork()方法在if语句中的工作方式有点困惑。我知道一旦它被调用,它会
printf("L1 ");
if(fork() != 0) {
printf("L2 ");
if(fork() != 0) {
printf("L3 ");
fork();
}
}
printf("End \n");
作为练习,我试图找出运行此代码(而不是实际运行它)将导致的有效/无效输出的一些示例
我仍然对fork()方法在if语句中的工作方式有点困惑。我知道一旦它被调用,它会返回两次,这表明它创建了两个进程。所以如果我这样做
printf("L1 ");
fork();
printf("L2 ");
我会得到L1
但我仍然不确定它在语句中的工作方式,比如在第一段代码中
我认为以下是一些有效/无效的输出:
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的子级直接进入
printf(“End”)
。只有父级将打印L1
,L2
,L3
,因此它们将按顺序每个只打印一次。与该输出混合在一起的是子进程的End
s(以及父进程的最后一端)。如果fork()
调用全部失败,则只有一个进程,因此它将打印:
L1 L2 L3 End
如果每次fork()
调用都成功,则:
L1
开始,以end
结束fork()
返回非零值时,它是父进程如果
在第一个子项中失败,那么它将打印L1 End
if
传入父级,随后的输出将包括L2
如果
在第二个子项中失败,那么它将打印L1 L2 End
if
传入父级,随后的输出将包括L3
fork()
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
另一个观察序列(两次运行中的第二次)是:
这里的标签信息有一个非常简单的解释:是的,谢谢。我已经记下了这个概念。我想要的更多的是解释它在if语句中是如何工作的,以及我的输出是否符合codeAh的逻辑,所以你是说一个有效的输出应该是(l1,l2,l3,end)或(l1,end,l2,end,l3,end)?为什么子进程直接进入end语句?在子进程中,
fork()
返回零,而父进程得到子进程的进程ID。第三个fork创建了两个进程,都是printL1 L2 L3 end
@JonathanLeffler,但第三个fork之后剩下的就是printf(“end\n”)
!我不会说,fork
创建了两个进程;它创建了一个新的进程,而旧进程只是在新进程的基础上继续运行。@ooga:OK;我的措辞马虎。在第三个fork之后,有两个进程,父进程和子进程,这两个进程都继续添加End
。并且它们都在打印缓冲区中已经有L1 L2 L3
。
L1 L2 L3 End
End End
End