2016-08-09 6 views
1

fork()の呼び出しが正常に実行された場合、Unixは に、アドレス空間の2つの同一のコピーを作成します。 両方のプロセスは、fork()コールの次の文で実行を開始します[Ref:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html]fork()システムコールのコンセプト

だから、私は次のコードを実行した場合:どこを説明してください

#include <stdio.h> 
int main(void) 
{ 
    printf("Hello\n"); 
    fork(); 
    printf("World\n"); 
    return 0; 
} 

を私はそれが

Hello 
World 
World 

を印刷すると思います。しかし、私はプログラムを実行するときには、

Hello 
World 
Hello 
World 

を印刷します私は概念が欠けていますか?

+0

奇妙な、私は期待された出力を得ています。 こんにちは ワールド ワールド – Rusty

+0

もし私が間違っていたら、あなたはprintf()を使うと 'Hello World World' o/p.correctを持つことはできません。 – Hailey

+0

あなたは出力として "Hello World World"を持っています。私は単純にコードをコピーしてコンパイルし、同じものを得ました。これは私が期待したものです。 – Rusty

答えて

2

これはバッファリングに関するものです。 「こんにちは」を印刷するとすぐには出力されません。代わりに、バッファーに移動します。フォーク中もまだそこにあるので、各タスクが終了してバッファをフラッシュすると、出力に送るコピーが2つあります。

これに対処するには、バッファなしのI/Oを指定するか、またはバッファをフラッシュするためにforkの前にfflushを呼び出します。

+0

@Gillesは、端末出力をフラッシュするために端末入力を使用することについて言及しませんでした。私はまだそれが言及する価値があると思います。 'fflush'も同様に動作します。それはちょっと好きです。 – Andrew

+0

私はそれが「好き」になるのを見ません。 'fflush'は、よりシンプルで常に働くという利点があります。ターミナル入力を使用するのは、ターミナル入力を読み込んでいる場合のみです。 – Gilles

+0

@Gilles、私の考えは、OPは初心者なので、システムコールの広い範囲を知りませんでした。簡単な言葉で返信したいので、新しい文書を掘り下げずにアイデアを得ることができます。ターミナルI/Oは、ほとんどの人が出発する場所です。 – Andrew