コードは次のとおりです。C - 次のように標準出力の印刷受注
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
出力:出力がこの順に印刷されている理由泥
は、誰かが説明できますか?
コードは次のとおりです。C - 次のように標準出力の印刷受注
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
出力:出力がこの順に印刷されている理由泥
は、誰かが説明できますか?
標準出力はデフォルトでバッファーに入れられます。これはprintf("u")
を意味し、を意味し、fflush
または改行文字が表示されるまで、"u"
のみをバッファーに入れます。バッファ内の「U」を
printf("u");
fflush(stdout);
write(STDOUT_FILENO, "m", 1);
printf("d\n");
printf
店舗:順序で出力を表示するには、これを試してみてください。 write
は、基礎となるfiledescritorにデータを書き込みます。次のprintf
は "d \ n"をバッファに入れます。将来的に(プログラムが終了するか、またはバッファがいっぱいであると十分にprintf
を呼び出すと)、バッファは基礎となるファイル記述子に書き込まれます。
標準Cストリームによる出力はバッファされます。 printf
への最初の呼び出しはu
にバッファに格納され、2番目の行はwrite
システムコールを介してm
を直接システムの標準出力ファイルハンドルに出力し、最後にprintfの2番目の呼び出しはバッファに改行とd
を格納し、 (通常、FILE*
が端末に関連付けられている場合はデフォルトである)、\n
がフラッシュを引き起こすか、またはプログラムの正常終了時にストリームがフラッシュされるため、システム標準出力ハンドルへのバッファに格納されます。
stderr
は、デフォルトではバッファリングされていない、これを試してみてください。
fprintf(stderr, "u");
write(STDERR_FILENO, "m", 1);
fprintf(stderr, "d\n");
この質問の「端末」はどこにありますか? ttyとのstdoutの衝突を止めてください。 –
@WilliamPursell:私は同意する、私は答えをより正確に変更した。 – chqrlie
いいえ、標準出力はラインバッファリングされていません。 *が*端末に関連付けられている場合は、デフォルトで行バッファリングされます。パイプや通常のファイルに関連付けられている場合は、そうでない可能性があります。 –
@WilliamPursellその参考資料を表示できますか? – fluter
http://man7.org/linux/manage/man3/setbuf.3.html –