私は次のプログラムを書いています:
int main()
{
printf("one\n");
write(1, "two\n", 4);
return 0;
}
そして、コマンド ./a.out | を与えます。出力が one two ではなく two one になる端末の cat なぜ???
これは、 の出力printfが によってバッファリングされ、 の出力がバッファリングされlibcないwriteためです。これは、ファイル(stdout)に対する直接のバッファリングされていない操作です。
これを読んでください:
stdout が端末の場合、バッファリングは自動的に行バッファリングに設定され、それ以外の場合はバッファリングに設定されます
したがって、実際にパイプしていますcat-それがバッファリングが有効になっている理由です(表示せずcatに試してください)
バッファリングをオフにするには、次のstdbufコマンドを発行します。
stdbuf -o0 ./a.out | cat
ところで、これは日常的に C のハッカーではない人に尋ねるのに最適な質問です。シンプルでわかりやすい!
hek2mgl が指摘したように、それはバッファリングが原因です。物事を強制したい場合はfflush(stdout)、の後に置くことができます。printf