2
int main()
{
    if(Fork() == 0)
    {
       printf("a");
    }
    else
    {
       printf("b");
       waitpid(-1, NULL, 0);
    }

    printf("c");
    exit(0);
}

上面的代码询问可能的输出是什么?

我发现,acbc、abcc、bacc 但答案包括 bcac。bcac 怎么可能是一个答案?父进程是在子进程创建之前退出还是某事。别的?我很困惑,欢迎任何解释。

谢谢。

4

2 回答 2

2

唯一的保证是waitpid在孩子的状态信息可用之前不会返回(除非它被中断)。只要你打电话exit(0),0就可以了。所以waitpid可以在孩子的输出被刷新之前返回。

POSIX 说:“wait() 函数应暂停调用线程的执行,直到调用进程的已终止子进程之一的状态信息可用,或者直到传递一个信号,该信号的动作是执行信号捕获函数或终止进程。” (它还说waitpid在这方面是相同的。)

我不知道发生这种情况的任何实际平台,只能想象它发生在在用户空间中模拟 POSIX 的操作系统上,因此有一些用户空间代码来向父母发出孩子正在终止而不是使用其实际终止的信号给家长发信号。但这是标准允许的。

这真的很模糊,我想知道这是否是该序列的预期理由。我想不出别的了。

于 2012-05-29T07:47:54.613 回答
0

答案是不要总是相信教科书!

勘误表

页。772,练习题 8.3 的解法。序列 bcac 是不可能的。删除倒数第二句。最后一句应该是“有三种可能的序列:acbc、abcc 和 bacc。” 请参阅 Web Aside 页面上的 Web Aside ECF:GRAPHS 以获取过程图的示例。

于 2014-12-11T21:19:18.790 回答