为了账号安全,请及时绑定邮箱和手机立即绑定

为什么该程序打印“分叉!” 4次?

为什么该程序打印“分叉!” 4次?

四季花海 2019-10-16 14:33:21
为什么该程序打印“分叉!” 4次?#include <stdio.h>#include <unistd.h>int main(void) {  fork() && (fork() || fork());  printf("forked!\n");  return 0;}
查看完整描述

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。


查看完整回答
反对 回复 2019-10-16
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

对于所有反对者来说,这是一个合并但又不同的问题。怪SO。谢谢。


您可以将问题分解为三行,第一行和最后一行都只是使过程数加倍。


fork() && fork() || fork();

操作员正在短路,所以这是您得到的:


       fork()

      /      \

    0/        \>0

 || fork()     && fork()

     /\            /   \

    /  \         0/     \>0

   *    *     || fork()  *

                /   \

               *     *

所以这总共4 * 5 = 20处理每行打印一行。


注意:如果fork()由于某种原因失败(例如,您对进程数有一定限制),它将返回-1,然后您将获得不同的结果。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 540 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信