2016-04-08 10 views
8
#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1; 
    fork(); 
    exit(0); 
} 

forkcoutにストリーミングの後に配置されるが、このコードを印刷11 なぜ?そして、なぜstd::endlcoutに追加された場合にのみ、コードは1を出力しますか?なぜfork()は出力が重複するのですか?

#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1 << std::endl; 
    fork(); 
    exit(0); 
} 
+8

バッファは2つのプロセスで2回フラッシュされます。男、迷惑になるはずです。 –

+1

残念ながら、C++オブジェクトはフォークするとうまく動作しません。基本的に、オブジェクトはコピーを作成せずに効果的にコピーを構築し、C++で構築された多くの保護を回避します。 – SergeyA

+0

私は、標準的なコンテナに 'fork()'が発生するという混乱しか想像できません。ただこれをしないでください。 –

答えて

12

これはストリームバッファリングによるものです。ストリームにstd::endlを挿入すると、ストリームがフラッシュされるので、フォークするとストリームバッファは空になります。 std::endlを挿入しないと、ストリームはプログラムが終了するまでフラッシュされません。 fork()は、フラッシュされていない内容を含む出力ストリームを複製します。 fork()の後に、 '1'を含むフラッシュされていない出力バッファを持つ2つのプロセスがあります。彼らはそれぞれ出口を抜け、バッファをフラッシュし、 "11"と表示します。

関連する問題