c中fork()&& fork()|| fork()的含义是什么?

时间:2018-01-07 10:44:59

标签: c fork

我对fork进程有疑问。我有一个代码

int main(int c, char **v){
  fork();
  fork() && fork() || fork();
  printf("Hello\t");
}

根据我的上述代码的输出将是 2 4 = 16次"Hello",因为每个fork创建了自己的两个副本,因此总体变为2*2*2*2 16"Hello"。 但它不正确它给我的输出为10次Hello。这里发生了什么?

1 个答案:

答案 0 :(得分:7)

这是一个脑筋急转弯,测试你对fork的理解以及逻辑运算符在C中的工作原理。特别是它们的短路评估。它的工作原理基于以下原则:

    如果第一个表达式计算为真值(不是0),则
  • ||不会计算第二个表达式。

  • 如果第一个表达式计算为假值(0),则
  • &&不会计算第二个表达式。

  • &&的优先级高于||。所以“棘手”的表达式等同于完全括号((fork() && fork()) || fork());

  • fork向子进程返回0,向父进程返回0以外的值。它在失败时返回-1,但在问题中明显成功。

考虑到这一点,我们可以按如下方式跟踪流程创建:

  1. 原始流程无条件地调用fork。因此产生了2个过程。

  2. #1中的每个进程都会调用逻辑表达式中的第一个fork。这样创建的每个子节点都返回0,因此它不会在fork之后调用&&。进程总数现在为4。

  3. #1 的两个进程fork之后调用&&。他们创建了另外两个流程。将我们带到总共6个。父母满足||的左子表达式,因此他们不再调用fork。新创建的子进程尚不满足||。所以他们会拨打最后一个fork

  4. 在#2中创建的两个孩子和在#3中创建的两个孩子在fork之后调用最后一个||。它们总共产生了4个进程。将计数提高到10。