2017-10-22 12 views
0
#include <stdio.h> 
#include <unistd.h> 
int main(void) { 
    int i = 0; 
    for (i = 0; i < 4; i++) { 
    fork(); 
    printf("foo\n"); 
    } 
    return 0; 
} 

これは「foo」を30回印刷します。どうして?このCプログラムでfork()はどのように動作しますか?

出力をパイプすると、なぜ "foo"が64回印刷されますか?

$ ./a.out | wc -l 
64 
+0

試しましたか? – Scheff

+0

'fork()'の後に変数に同じ値を持つ2つのプロセスが存在することに注意してください。したがって、ループの各反復では、プロセスの数が重複していなければなりません。これは2 + 4 + 8 + 16 = 30です。私は30 'foo'の出力を期待します。私は正しい? (もちろん、 'fork()'のどれも失敗しないと仮定します...) – Scheff

+0

面白いです。私はターミナルに印刷するだけではファイルやlessやwc -lのようなプログラムにパイプして印刷すると、結果は変わります。私はwc -lで64を得る。 –

答えて

1

fork()を呼び出すとすべてが複製されます。だから、各反復で二倍になります。そのため、2 + 4 + 8 + 16 = 30回印刷します。プロセスのPIDと一緒にiの値を印刷すると、これは簡単にわかります。

mchで述べたように、配管は出力バッファをラインバッファからフルバッファに変更するので、フォークはバッファ内容も複製します。だからこそ、64枚の印刷物が得られるのです。

関連する問題