【问题标题】:How do the C fork() and wait() calls work?C fork() 和 wait() 调用如何工作?
【发布时间】:2012-01-03 12:23:51
【问题描述】:

**伪代码!

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() 打印看起来也相同?

【问题讨论】:

    标签: c operating-system fork


    【解决方案1】:

    没错。等待调用将对进程执行的顺序施加一些限制,但您仍然会有 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% 你永远不会遇到会收获孙子的 wait(),但听到这件事我会感到非常惊讶。

    【讨论】:

    • 在没有等待的情况下,第一个版本不会出现相同的打印输出吗?
    • @JimAvery:你不能确定。这取决于如何对进程进行调度。第一个无法确定父子执行的顺序,因此无法确定printf 语句的顺序。但是,在第二种情况下,可以保证父母会在 wait() 呼叫等待孩子完成。
    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多