1

私の教科書には、次のメインルーチンが記載されています。

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

可能な出力が何であるかを尋ねると、3つ見つかりました:

abcc: OS は最初に実行する子プロセスを選択し、"a" を出力します。次に、OS は子プロセスを一時停止し、親プロセスを再開して "b" を出力します。次に、親は子が完了するまで待機する必要があり、子は「c」を出力し、最後に親は「c」を出力します。

bacc: OS は最初に実行する親プロセスを選択し、「b」を出力します。次に、親は子が完了するのを待って「ac」を出力する必要があります。次に、親は「c」を出力します。

acbc: OS は、完了まで最初に実行する子を選択し、"ac" を出力します。次に、親が最後まで実行され、"bc" が出力されます。

しかし、もう 1 つの答えが教科書 bcac に記載されています。b が最初に出力された場合、親は子が続行するのを待たなければならず、「ac」を出力すると、親は「c」を出力し、すでにリストした bacc を与えるため、これがどのように可能かわかりません. 私が見逃しているものはありますか、それとも可能な出力は 3 つしかないと言うのは正しいですか?

4

1 に答える 1

0

いつも教科書を信用してはいけません...

エラッタから:

p。772、練習問題 8.3 の解。シーケンス bcac は使用できません。最後から 2 番目の文を打ちます。最後の文は「3 つの可能なシーケンスがあります: acbc、abcc、および bacc」です。プロセス グラフの例については、Web Aside ページの Web Aside ECF:GRAPHS を参照してください。

于 2014-12-11T21:43:23.190 に答える