我有以下代码:
int main(){
if (fork() + fork())
printf("Boom!\n");
return 0;
}
我不理解为什么这段代码会打印三次消息。
有人能给我解释一下吗?
Fork函数对于父进程返回非零值,对于子进程返回0。
所以父进程首先进行一次fork调用,创建一个子进程(fork1
)。这个子进程会再次进行一次fork调用(执行第二个fork)(fork2
),创建第二个子进程。然后父进程在第二次fork调用上进行fork,创建第三个进程(fork3
)。因此,我们将得到如下的树形结构:
Parent
fork1 fork3
fork2
Parent
将具有非零返回值,因为两个fork()
调用都返回非零值fork1
将具有非零返回值,因为最后一个fork返回非零值fork2
将具有零返回值,因为第一个fork是零(这是从fork1
继承的),而第二个fork也将返回零(fork2
是在第二个fork中创建的)。fork3
将具有非零返回值,因为它继承了来自Parent
的第一个fork值。fork() + fork()
不为零时,if语句将被执行。因此,会发生三次“boom”!请执行以下测试:
int main() {
pidsum = fork() + fork();
printf("%d", pidsum);
}
1用于3个子线程。 这3个子线程具有不同的PID。- Mickaël P