问题描述
- 深入理解计算机系统 8.3题
-
#includeint main()
{
if(fork()==0){
printf("a");
}
else{
printf("b");
waitpid(-1,NULL,0);
}printf("c");
exit(0);
求问这个程序的可能输出序列?
答案给出了acbc,bcac,abcc,bacc四种答案。
但是我觉得不应该有四种,因为fork以后有两个进程,但是父进程会遇到waitpid,这个必须要等到子进程
终止以后,父进程才会继续下去,所以只有三种情况,一是父进程先开始,遇到waitpid等待,知道子进程结束,那么就是bacc,或者是子进程先开始,那么就有acbc,或者是abcc
解决方案
深入理解计算机系统 第3章54题
《深入理解计算机系统》读书笔记
《深入理解计算机系统》(四)
解决方案二:
waitpid(-1,NULL,0);应该主要是这个函数调用的原因:
第一次参数为-1时,任何子进程退出waitpid()都将返回,不一定是自己的子进程,所以bcac,这种情况是可能存在的
解决方案三:
不好意思,你是对的,我说错了。
参考地址:http://csapp.cs.cmu.edu/2e/errata.html
p. 772, Solution to Practice Problem 8.3. The sequence bcac is not possible. Strike the second to last sentence. The last sentence should be “There are three possible sequences: acbc, abcc, and bacc.” Please see Web Aside ECF:GRAPHS on the Web Aside page for an example of the process graph.