我试图弄清楚为什么这句话会产生2个过程
if(fork()&&(fork()||fork()))
printf("Hello");
我理解短路问题,而且我知道如果执行此声明,我们将总共获得4个进程。那么你能解释一下将if插入到这样的语句中所使用的标准吗。
答案 0 :(得分:5)
应该创建4个进程。您可以通过在printf
声明后添加额外的if
来轻松验证这一点。
printf("Hello")
只运行两次,因为条件仅适用于其中两个进程。
具体来说,根进程会生成两个子进程,第二个子进程会产生一个进程:
<parent> : condition is true because the two first fork calls return non-0 : (true && (true || ??))
<child1> : condition is false because the first fork returns 0: (false && (?? || ??))
<child2> : condition is true because the first and third fork calls return non-0: (true && (false || true))
<child3> : condition is false because the second and third fork calls return 0: (true && (false || false))
答案 1 :(得分:1)
因为||如果内部的第一个fork()解析为true(实际上不同于0),则语句返回true。
&amp;&amp;语句需要知道第一个fork和第二个fork。
所以在你的代码中
if (fork() && // this needs to be evaluated so it forks
(fork() || // this needs to be evaluated so it forks
fork() // the previous one was true, so this doesn't need to be evaluated
) )
所以你最终会完成两把叉子。