2
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。

4

2 に答える 2

2

唯一の保証はwaitpid、子供のステータス情報が利用可能になるまで(中断されない限り)戻らないことです。を呼び出すとすぐexit(0)に、0が使用可能になります。したがって、子の出力がフラッシュされるwaitpidに戻ることができます。

POSIXは、次のように述べていますまたはプロセスを終了します。」(また、waitpidはこの点で同一であると言っています。)

これが発生する実際のプラットフォームはわかりません。ユーザースペースでPOSIXをエミュレートし、実際の終了を使用するのではなく、子が終了していることを親に通知するユーザースペースコードがあるOSでのみ発生することを想像できます。親に信号を送ります。しかし、それは基準によって許可されています。

これは本当にあいまいであり、これがそのシーケンスの予想される理論的根拠であるかどうか疑問に思います。私は他に考えられません。

于 2012-05-29T07:47:54.613 に答える
0

答えは、教科書を常に信頼するとは限らないということです。

正誤表から:

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

于 2014-12-11T21:19:18.790 に答える