次のコードがあります。
for(i=1; i<=2; i++)
{
fork();
printf("x ");
}
x を 6 回出力する必要があると計算しました。最初の反復で 2 回、2 回目の反復で 4 回です。
代わりに、X が 8 回出力されます。なんで?
バッファリングのため。通常stdout
はラインバッファなので
printf("x ");
をすぐ"x "
に端末に書き込むのではなく、出力バッファに書き込みます。それはプロセスが s のときにコピーされるfork()
ため、2 回目の繰り返しの後の 4 つのプロセスのそれぞれは"x "
、出力バッファーに 2 つ [親から 1 つ/最初の繰り返しで fork する前に 1 つ、2 番目の繰り返しから 1 つ] を持ち、プロセスが終了して 8 つx
の s が実行されます。まとめて印刷。
の直後にバッファーをフラッシュするprintf("x ");
と、6 つだけが出力されます。