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

Aja*_*mar -1 c fork

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

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

据我说,上面代码的输出将是2 4 = 16次"Hello",因为每个fork创建它自己的两个副本,所以总体变成2*2*2*2哪些是16时间"Hello".但它不正确它给我输出的10次数你好.这里发生了什么?

Sto*_*ica 7

这是一个脑筋急转弯,可以测试您对forkC中逻辑运算符的理解和运算方式.特别是它们的短路评估.它基于以下原则工作:

  • || 如果第一个表达式计算为真值(不是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.