运行这个程序会打印“forked!” 7次。谁能解释一下如何“分叉!”被打印了7次?
#include<stdio.h>
#include<unistd.h>
int main(){
fork() && fork() || fork() && fork();
printf("forked!\n");
return 0;
}
这里使用了几个概念,第一个是知道什么fork
在某些情况下它会做什么以及会返回什么。很快,当它被调用时,它会创建调用者的重复进程并返回0
(false
对于逻辑表达式)在子进程中且非零(true
对于逻辑表达式)对于父进程。
实际上,如果发生错误,它可能会返回负(非零)值,但这里我们假设它总是成功。
第二个概念是逻辑表达式的短路计算,例如&&
and ||
, 具体来说,0 && fork()
will not call fork()
,因为如果第一个操作数是false
(零),那么就不需要计算第二个。相似地,1 || fork()
不会打电话fork()
两者都不。
另请注意,在子进程中,表达式的计算在与父进程中相同的点继续。
另请注意,由于优先级,表达式按以下顺序计算:
(fork() && fork()) || (fork() && fork())
这些观察应该会引导您得出正确的答案。
考虑以下简化示例fork() && fork()
fork()
/ \
false true && fork()
/ \
false true
所以这里我们创建了三个进程,其中两个返回false
结果一返回true
。那么对于||
我们有所有进程返回false
尝试再次运行相同的语句,所以我们有2 * 3 + 1 = 7
作为答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)