我对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。这里发生了什么?
答案 0 :(得分:7)
这是一个脑筋急转弯,测试你对fork
的理解以及逻辑运算符在C中的工作原理。特别是它们的短路评估。它的工作原理基于以下原则:
||
不会计算第二个表达式。
&&
不会计算第二个表达式。
&&
的优先级高于||
。所以“棘手”的表达式等同于完全括号((fork() && fork()) || fork());
fork
向子进程返回0,向父进程返回0以外的值。它在失败时返回-1,但在问题中明显成功。
考虑到这一点,我们可以按如下方式跟踪流程创建:
原始流程无条件地调用fork
。因此产生了2个过程。
#1中的每个进程都会调用逻辑表达式中的第一个fork
。这样创建的每个子节点都返回0,因此它不会在fork
之后调用&&
。进程总数现在为4。
#1 的两个进程在fork
之后调用&&
。他们创建了另外两个流程。将我们带到总共6个。父母满足||
的左子表达式,因此他们不再调用fork
。新创建的子进程尚不满足||
。所以他们会拨打最后一个fork
。
在#2中创建的两个孩子和在#3中创建的两个孩子在fork
之后调用最后一个||
。它们总共产生了4个进程。将计数提高到10。