2011-11-22 38 views
2

**伪代码!C fork()和wait()调用如何工作?

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()打印也长得一模一样?

回答

3

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

这是可能的,但在所有的8个进程将在同一时间被执行,在等待该版本的第一个版本不能保证并发进程的数量将肯定不会达到8

在我的系统,等待()只会在直接的孩子完成时才会返回,这样您的等待版本将会以确定的方式打印出来:在父母继续之前,孩子总是会完成的。

通常情况下,你会看到

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%,你永远不会遇到等待()会收获孙子们,但我会非常惊讶的听到它。

+0

如果没有等待,第一个版本会出现相同的打印输出吗? –

+0

@JimAvery:你不能确定。这取决于如何在流程中完成调度。父母和孩子执行的顺序不能在第一个中确定,因此不能确定“printf”语句的顺序。但是,在第二种情况下,确保父母将等待'wait()'调用孩子完成。 –