2016-12-07 15 views
0
void main(){ 
    if(fork()==0) 
    printf("a"); 
    else{ 
    printf("b"); 
    waitpid(-1,NULL,0); 
}  
    printf("c"); 
    exit(0); 
} 

質問:プログラムの出力は何ですか?フォーク()親と子プロセス

a。 acbc

b。 bcac

c。 abcc

d。 bacc

e。またはCまたはD(正解)

だから私は、Cがcorret answer.The以下のいずれかである理由を把握しようとしています私の推論です:

子プロセスが最初に行く、その後に制御を停止し、合格(プリントアウトcは子プロセスになるためのwaitpidの親プロセス、(「」プリントアウト)

、親プロセスを実行する(「B」プリントアウト)()、

親バック子に 制御を渡します)、子供は刈り取られます。

最後に、親プロセス「c」に戻ります。だから我々はabccを持っている。

私は正しいですか?

+0

おそらく私は何について話しているのか分かりませんが、Cは正しいと思いますか?それがEでなければならないようです。 – Iluvatar

+0

Eは正解です。 –

答えて

1

理論的には、あなたの答えは正しかった、このように起こる可能性があります(最後に(a)、(c)、(d)に起こりそうです)。

実際には、正しい答えは(a)です。

stdioは、出力をキャッシュして高価なシステムコールを回避するために内部的にバッファを使用しているためです。したがって、あなたのプログラムが `\ n '(改行)を出力するか終了するまで、出力は全くありません。

だから、本当のシナリオがあることを行っている。

  1. 子がバッファに'c'、その後、バッファに文字'a'を押してください。
  2. 親は同時に文字'b'をプッシュして子を待ちます。
  3. 子供はその前に"ac"を含むバッファを終了してフラッシュします。
  4. 親はwaitpid()から戻り、'c'をバッファにプッシュします。
  5. 親は、"bc"を含むバッファを終了してフラッシュします。第二部分について

SIGKILLは、(離れていくつかのシステムプロセスからの)任意のプロセスを殺すことができます。子プロセスは他のプロセスと同様に通常のプロセスです。

waitpidは、終了するまで子プロセスを待つことです。プロセスを殺すこととは何の関係もなく、待っているだけです(どちらのシグナルに関係なく、自身の出口や殺されたことによる)。

0

Cがどのように起こるかについてのあなたの推論は正しいです。タイミング(下降)は次のようになります。

Parent Child 
      a 
b 
(waitpid) 
      c 
c 
関連する問題