2016-05-10 6 views

答えて

3

標準出力はデフォルトでバッファーに入れられます。これはprintf("u")を意味し、を意味し、fflushまたは改行文字が表示されるまで、"u"のみをバッファーに入れます。バッファ内の「U」を

printf("u"); 
fflush(stdout); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n"); 
+0

いいえ、標準出力はラインバッファリングされていません。 *が*端末に関連付けられている場合は、デフォルトで行バッファリングされます。パイプや通常のファイルに関連付けられている場合は、そうでない可能性があります。 –

+0

@WilliamPursellその参考資料を表示できますか? – fluter

+0

http://man7.org/linux/manage/man3/setbuf.3.html –

2

printf店舗:順序で出力を表示するには、これを試してみてください。 writeは、基礎となるfiledescritorにデータを書き込みます。次のprintfは "d \ n"をバッファに入れます。将来的に(プログラムが終了するか、またはバッファがいっぱいであると十分にprintfを呼び出すと)、バッファは基礎となるファイル記述子に書き込まれます。

1

標準Cストリームによる出力はバッファされます。 printfへの最初の呼び出しはuにバッファに格納され、2番目の行はwriteシステムコールを介してmを直接システムの標準出力ファイルハンドルに出力し、最後にprintfの2番目の呼び出しはバッファに改行とdを格納し、 (通常、FILE*が端末に関連付けられている場合はデフォルトである)、\nがフラッシュを引き起こすか、またはプログラムの正常終了時にストリームがフラッシュされるため、システム標準出力ハンドルへのバッファに格納されます。

stderrは、デフォルトではバッファリングされていない、これを試してみてください。

fprintf(stderr, "u"); 
write(STDERR_FILENO, "m", 1); 
fprintf(stderr, "d\n"); 
+0

この質問の「端末」はどこにありますか? ttyとのstdoutの衝突を止めてください。 –

+0

@WilliamPursell:私は同意する、私は答えをより正確に変更した。 – chqrlie

関連する問題