为什么这个fork()输出产生8而不是5?

所以我必须find这个使用fork()方法的代码的输出。 我以为输出是5“你好”,但我得到了8。为什么呢? 这是代码:

 #include "csapp.h" void doit() { Fork(); Fork(); printf("hello\n"); return; } int main() { doit(); printf("hello\n"); exit(0); } 

Solutions Collecting From Web of "为什么这个fork()输出产生8而不是5?"

这是你的代码在做什么:

 main->doit()->Fork()->Fork()->printf()->return->printf()->exit() | | | ----->printf()->return->printf()->exit() | ----->Fork()->printf()->return->printf()->exit() | ----->printf()->return->printf()->exit() 

正如你所看到的,你总共有8次调用printf()

如果你选择在main函数和doit函数中打印不同的字符串,你会更容易看到发生了什么事情。

在每个printf()调用中设置断点是解决这类问题的另一个有效策略。

首先你叫叉,你的一个过程分成两个。 然后在每个生成的过程中调用fork,总共有4个。然后4个进程打印hello,返回并打印hello,总共8个hellos。

您创建流程#1。 在打印任何东西之前,进程#1调用fork()并生成一个我们将调用进程#2的克隆。 #1和#2进程再次调用fork() ,将其克隆到进程#3和#4。 现在你有4个进程,每个进程打印两次。 打印多少个hello