我对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次数你好.这里发生了什么?
这是一个脑筋急转弯,可以测试您对forkC中逻辑运算符的理解和运算方式.特别是它们的短路评估.它基于以下原则工作:
|| 如果第一个表达式计算为真值(不是0),则不会计算第二个表达式.
&& 如果第一个表达式计算为假值(0),则不会计算第二个表达式.
&&优先于||.所以"棘手"的表达式相当于完全括号((fork() && fork()) || fork());
fork将0返回到子进程,将0以外的值返回到父进程.它在失败时返回-1,但在问题中显然会成功.
考虑到这一点,我们可以跟踪流程创建如下:
原始进程fork无条件地调用.从而产生2个过程.
#1中的每个进程都调用fork逻辑表达式中的第一个进程.这样创建的每个子节点都返回0,所以它不会在fork之后调用&&.进程总数现在为4.
来自#1的两个进程会在fork之后调用&&.他们创建了另外两个流程.把我们带到总共6个.父母满足左子表达式,||所以他们不再打电话fork了.新创建的子进程不满足||尚未完成.所以他们会打电话给最后一个fork.
在#2中创建的两个子节点和在#3中创建的两个子节点在fork后面调用最后一个节点||.它们总共产生了4个进程.将计数提高到10.
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |