1

我的教科书给出了以下主要程序:

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

它询问可能的输出是什么,我找到了 3 个:

abcc:操作系统选择首先执行的子进程,并打印“a”。然后,操作系统暂停子进程并恢复父进程,打印“b”。然后父母必须等到孩子完成,孩子打印“c”,最后父母打印“c”。

bacc:操作系统选择首先运行的父进程,并打印“b”。然后父母必须等待孩子完成并打印“ac”。然后父母打印“c”。

acbc:操作系统选择子进程先运行直到完成,打印“ac”。然后父进程运行完成,打印“bc”。

但是,教科书中还列出了一个答案,bcac。我不明白这是怎么可能的,因为如果首先打印 b,那么父母必须等待孩子继续,然后打印“ac”,然后父母会打印“c”,给出我已经列出的 bacc . 是否有我遗漏的东西,或者说只有 3 个可能的输出是否正确?

4

1 回答 1

0

不要总是相信教科书...

勘误表

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

于 2014-12-11T21:43:23.190 回答