3 回答
TA贡献2003条经验 获得超2个赞
第fork()
一个在调用过程中返回一个非零值(称为p0),在子进程中返回0(称为p1)。
在p1中,发生短路,&&
然后过程调用printf
并终止。在p0中,过程必须评估表达式的其余部分。然后fork()
再次调用,从而创建一个新的子进程(p2)。
在p0中,fork()
返回一个非零值,并进行短路||
,因此该过程调用printf
并终止。
在p2中,fork()
返回0,所以||的其余部分 必须评估,这是最后一个fork()
;导致为p2创建一个孩子(称为p3)。
然后printf
,P2执行并终止。
然后printf
,P3执行并终止。
printf
然后执行4 s。
TA贡献1844条经验 获得超8个赞
对于所有反对者来说,这是一个合并但又不同的问题。怪SO。谢谢。
您可以将问题分解为三行,第一行和最后一行都只是使过程数加倍。
fork() && fork() || fork();
操作员正在短路,所以这是您得到的:
fork()
/ \
0/ \>0
|| fork() && fork()
/\ / \
/ \ 0/ \>0
* * || fork() *
/ \
* *
所以这总共4 * 5 = 20处理每行打印一行。
注意:如果fork()由于某种原因失败(例如,您对进程数有一定限制),它将返回-1,然后您将获得不同的结果。
- 3 回答
- 0 关注
- 565 浏览
添加回答
举报