2016-09-18 6 views
2

私はfork()システムコールを利用してC言語でプログラムを持っています。私はそれが2つのフォーク2^2 = 4回* 2 Print Statement = 8回のためだと思う。私が間違っているなら、私を修正して理由を説明してください。Cフォークプログラムの出力の説明

ここで、質問はなぜ私はそれぞれの実行で異なる出力を得ているのですか?のは、私はこのコードを実行するとしましょう:私は出力

Unix System Programming 
WTF 
Unix System Programming 
Unix System Programming 
Unix System Programming 
WTF 
WTF 
WTF 

と私が得る第二の時間を取得する最初の時間:

Unix System Programming 
WTF 
Unix System Programming 
Unix System Programming 
WTF 
Unix System Programming 
WTF 
WTF 

そして三度目は再び異なります。なぜこれが起こるのですか?私は無知です。親切に詳細に説明してください。

+1

'doit()'の未使用変数 'pid'です。関数の 'return'も必要ではありません。 –

答えて

3

新しいプロセスをフォークすると、親と子の両方が同時に実行されます。彼らがそれぞれのprintf()ステートメントを実行する順序は予測できません。時には親が最初に印刷され、時には子が印刷されることもあります。

出力にPIDを含めると、各プロセスがどのプロセスで印刷されているかを理解することができます。 SOのように変更します。あなたが見るべきこと

printf("%d: Unix System Programming\n", getpid()); 

printf("%d: WTF\n", getpid()); 

すると、各プロセスがWTFUnix System Programmingを出力しますが、処理の順序が混同されることがあります。

+0

いいえ@バーマ!私はこのプログラムで2つのフォークを持っていれば1つの追加のことを知りたいので、少なくとも4つの子プロセスが実行され、1つの親プロセス(コード実行自体)が期待できる。そしてここでは合計2つのprint文がある。したがって、4 * 2 = 8倍の出力.Am i正しいかどうか、あるいは異なるのでしょうか? –

+2

フォークが2つある場合、4つのプロセスがあり、4つの子プロセスはありません。最初のフォークは1つの子を作成します。 2番目のフォークは親と子の両方で実行され、それぞれ1つの新しいプロセスが作成されます。したがって、1つの元のプロセス、2つの子プロセス、1つの孫プロセスで終わります。 – Barmar

+0

しかし、それぞれが2行を出力するので、8行の出力が得られます。 – Barmar

2

表示されている出力は、プロセスによって異なります。 forkが成功すると、(親プロセスと同様に)異なる子プロセスが取得されます。それらは異なるプロセスからのものなので、1つのプロセスがいつ順番に実行されて実行されるかを保証することはできません。したがって、異なるプロセスの出力が混在し、実行ごとに順序が異なる可能性があります。

親プロセスと子プロセスが特定の順序で実行されていることを確認したい場合は、それらを同期させる必要があります。通常、これはフォークするだけの作業です。 (おそらく待ち時間やパイプの使用が必要になります。