2017-08-14 12 views
0
if (fork() == 0) { 
    printf("[Child] I'm exiting\n"); 
} 

else { 
    wait(NULL); 
    printf("[Parent] child exited\n"); 

} 

wait(NULL)子が完了するまで待ってから、それ以降のすべてを実行します。この場合、プログラムの出力はどのようになりますか?この場合wait(null)は何を行い、プログラムの出力は何ですか?

最初に親に入ってから子供が完了するまで待つ必要がありますので、[Child] ..... , [Parent] ....が印刷されます。

子どもに行ってその物を印刷してから親にすることもできます。この場合、child processはすでに完成しているので、wait(NULL)は永遠に待機します。この場合、出力はとなり、[Child].....となりますか?

子供が終了していない場合、それが終了するまで、親はそれを待っています

おかげ

+0

'任意の子のための待機がcomplete'する::ので、それは*ブロック*待機時まで()を返します:あなたは常に参照してくださいよ、なぜ

がそれです。それが返ってきたら、あなたは**その子供が終わったことを知っている**。 – wildplasser

答えて

1

を私は1000回を走ったが、それはその常に子供の出力のように見えます...親。

子が終了した場合、親はそのステータス情報を取得してから実行を継続します。この場合、関数wait()はすぐに戻ります。 See this

ので、このプログラムは、常に印刷されます:あなたが実際に求めている下層の質問はどのようにfork作品であるよう

[Child] I'm exiting 
[Parent] child exited 
1

が見えます。

fork()を実行すると、オペレーティングシステムは呼び出しプロセス(親)を複製します。子を作成します。これは、親の正確な複製です(マイナスsome details)。 fork()関数の戻り値は、子プロセスでは0、親プロセスでは子PIDです。

したがって、forkの後に、子プロセスはif句の下のコードを実行し、親はelse句を実行します。 2つのプロセスが並行して実行されていることに注意してください。しかし親プロセスは、子プロセスが終了するまでwait(NULL)のためにブロックされます。子(メッセージを印刷する)を終了して終了すると、親はwaitの後にコードを実行し、メッセージを出力して終了します。

[Child] I'm exiting 
[Parent] child exited 
関連する問題