C fork()和wait()调用如何工作?

时间:2011-11-22 02:51:51

标签: c operating-system fork

**伪!

fork();
printf(--print process ID);
fork();
printf(--print process ID);
fork();
printf(--print process ID);

这...我今天在8个过程中假设结果(如果我错了,请纠正我)。

现在,如果等待呼叫被添加到此,会发生什么?

fork();
wait(..);
printf(--print process ID);
fork();
wait(..);
printf(--print process ID);
fork();
wait(..);
printf(--print process ID);

我认为1)进程数量相同而且2)printf()打印件看起来也一样吗?

1 个答案:

答案 0 :(得分:3)

真。等待调用将对进程执行的顺序施加一些限制,但您仍将有8个进程。 printf语句看起来是一样的,但它们可能会改变的顺序。

在第一个版本中可以但不能保证所有8个进程将同时执行,在等待的版本中,并发进程的数量肯定永远不会达到8个。

在我的系统上,wait()只会在直接子项完成后返回,这样您的等待版本将确定性地打印:在父母继续之前,孩子将始终完成。

通常,您会看到

N+1 //first printf
N+2 //second printf
N+3 //third printf
N+2 //third printf
N+1 //second printf
N+4 //third printf
N+1 //third printf
N   //first printf
N+5 //second printf
N+6 //third printf
N+5 //third printf
N   //second printf
N+7 //third printf
N   //third printf

其中N是根进程的pid。获得一个很好的连续PID数块取决于我倾向于在* nix系统上看到的通常的pid分配方案,而不是在你的玩具程序运行时设法启动其他进程。

我不熟悉足够多种操作系统100%表示你永远不会遇到等待孙子孙女的等待(),但听到这个消息后我会非常惊讶。