printf("L1 \n");
if (fork() != 0) {
printf("L2 \n");
if (fork() != 0) {
printf("L3 \n");
fork();
}
}
printf("End \n");
我很难理解这段代码。有人可以解释/显示流程图的样子吗?此外,有效和无效的序列。
我对流程图的想法是这样的:
L1将保留两个L2进程,然后每个L2进程将保存2个L3进程,每个L3进程将保留一个结束进程。这是对的吗?
我的有效序列是L1,L2,L3,End
无效的将是L2,L1,结束这是因为L1必须在L2之前,L2依赖于L1。
答案 0 :(得分:1)
好的,这里的代码正确缩进并带有编号的行。
1. printf("L1 \n");
2. if(fork() != 0) {
3. printf("L2 \n");
4. if(fork() != 0) {
5. printf("L3 \n");
6. fork();
7. }
8. }
9. printf("End \n");
让我们假设当你第一次运行它时父亲的PID是1000(它的数量无关紧要,无论如何它取决于操作系统,但是我们正在做出这个假设以明确这个过程树)。
流程PID==1000
打印L1
。到目前为止,我们有:
流程树:
1000
<强>输出:强>
L1
处理PID==1000
分叉,创建子进程(假设它是PID==1001
)。根据{{1}},只有进程man 2 fork
正在输入if块,因为PID==1000
将为子进程返回fork()
。
流程0
在第3行继续,其中它将打印PID==1000
然后继续到第5行,而进程L2
在PID==1001
块后跳转到第9行,所以它会打印if
。到目前为止,我们有:
流程树:
End
<强>输出:强>
-------------- 1000
|
|
1001
再次处理L1
L2
End
分叉,创建子进程PID==1000
。
再次,流程PID==1002
跳转到第9行,打印PID==1002
,因为End
为其返回fork()
,而父进程0
在第5行继续,打印PID==1000
,之后它将转到第6行。到目前为止,我们已经:
流程树:
L3
<强>输出:强>
------------ 1000
| |
| |
1001 1002
父进程L1
L2
End
L3
End
再次分叉。创建子进程PID==1000
。之后,父进程和子进程都进入第9行,因此它们都打印PID==1003
。最后,我们有:
流程树:
End
<强>输出:强>
------------- 1000 --------------
| | |
| | |
1001 1002 1003
要自己查看,您可以使用L1
L2
End
L3
End
End
End
更改当前代码中的printf()
,以确切了解每个流程将打印的内容。代码将是这样的:
getpid(2)