私の教科書には、次のメインルーチンが記載されています。
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 つしかないと言うのは正しいですか?