所以我必须find这个使用fork()
方法的代码的输出。 我以为输出是5“你好”,但我得到了8。为什么呢? 这是代码:
#include "csapp.h" void doit() { Fork(); Fork(); printf("hello\n"); return; } int main() { doit(); printf("hello\n"); exit(0); }
这是你的代码在做什么:
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
?