int main()
{
if(Fork() == 0)
{
printf("a");
}
else
{
printf("b");
waitpid(-1, NULL, 0);
}
printf("c");
exit(0);
}
上面的代码询问可能的输出是什么?
我发现,acbc,abcc,bacc但答案包括bcac。 bcac怎么能成为答案?父进程是在创建子进程之前退出还是sth。其他?我很困惑,欢迎任何解释。
日Thnx。
答案 0 :(得分:2)
唯一的保证是waitpid
在孩子的状态信息可用之前不会返回(除非它被中断)。只要您拨打exit(0)
,就可以使用0。因此waitpid
可以在刷新子项的输出之前返回。
POSIX说:“wait()函数应暂停执行调用线程,直到调用进程的一个已终止子进程的状态信息可用,或直到传递其信号为止动作要么是执行信号捕捉功能,要么是终止过程。“ (它还说 waitpid 在这方面是相同的。)
我不知道发生这种情况的任何实际平台,只能想象它发生在用户空间中模拟POSIX的操作系统上,因此有一些用户空间代码来通知父母孩子正在终止而不是使用它实际终止以表示父母。但这是标准所允许的。
这真的很模糊,我想知道这是否是该序列的预期理由。我无法想到其他人。
答案 1 :(得分:0)
答案是不要总是信任教科书!
来自errata:
页。 772,实践问题解决方案8.3。序列bcac不是 可能。罢工倒数第二句。最后一句应该 是“有三种可能的顺序:acbc,abcc和bacc。”请 请参阅Web Aside ECF:Web上的GRAPHS Aside页面上的示例 流程图。