为什么是进程总数2

时间:2015-02-03 12:45:21

标签: c operating-system fork

我试图弄清楚为什么这句话会产生2个过程

if(fork()&&(fork()||fork()))
 printf("Hello");

我理解短路问题,而且我知道如果执行此声明,我们将总共获得4个进程。那么你能解释一下将if插入到这样的语句中所使用的标准吗。

2 个答案:

答案 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
  ) )

所以你最终会完成两把叉子。