我有以下代码:
int main(){
if (fork() + fork())
printf("Boom!\n");
return 0;
}
我不明白为什么这段代码会打印信息3次。
有人可以解释一下吗?
答案 0 :(得分:5)
Fork返回非零值,而对于子进程则为零。
所以父进程分叉,创建一个子进程(fork1
)。这个子进程将再次fork(它将执行第二个fork)(fork2
)。创建第二个子进程。然后父进程将分叉第二个fork调用,创建第三个进程(fork3
)。所以我们将得到这样的树结构:
Parent
fork1 fork3
fork2
现在请注意,对于子进程,在fork之前执行的所有调用的值都是从父进程继承的。如果我们使用它,我们得到:
Parent
将返回非零值,因为两个fork()
调用都返回非零值fork1
将返回非零值,因为最后一个fork返回非零值fork2
将返回零值,因为第一个fork为零(这是从fork1
继承而来),第二个fork也将返回零(fork2
在第二叉)。fork3
将返回非零值,因为它会继承Parent
中的第一个fork值。当fork() + fork()
非零时,将执行if。因此3次繁荣!。
答案 1 :(得分:2)
进行以下测试:
int main() {
pidsum = fork() + fork();
printf("%d", pidsum);
}