我的教科书给出了以下主要程序:
int main()
{
if(fork() == 0)
{
printf("a");
}
else
{
printf("b");
waitpid(-1, NULL, 0);
}
printf("c");
exit(0);
}
它询问可能的输出是什么,我找到了3:
abcc:操作系统选择先执行子进程,然后输出“a”。然后,OS暂停子进程并恢复父进程,打印“b”。然后父母必须等到孩子完成,孩子打印“c”,最后父母打印“c”。
bacc:操作系统选择先运行父进程,然后输出“b”。然后父母必须等待孩子完成并打印“ac”。然后父母打印“c”。
acbc:操作系统选择孩子先运行直到完成,打印“ac”。然后父程序运行完成,打印“bc”。
但是,教科书中还有一个答案,bcac。我不明白这是怎么可能的,因为如果首先打印b,那么父母必须等待孩子继续,并打印“ac”,然后父母将打印“c”,给出我已经列出的bacc 。有什么我缺少的,或者说只有3种可能的输出是正确的吗?
答案 0 :(得分:0)
不要总是信任教科书......
来自errata:
页。 772,实践问题解决方案8.3。序列bcac不是 可能。罢工倒数第二句。最后一句应该 是“有三种可能的顺序:acbc,abcc和bacc。”请 请参阅Web Aside ECF:Web上的GRAPHS Aside页面上的示例 流程图。