私は次のプログラムを書いています:
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