1

私は次のプログラムを書いています:

int main() 
{
printf("one\n");
write(1, "two\n", 4);
return 0;
}

そして、コマンド ./a.out | を与えます。出力が one two ではなく two one になる端末の cat なぜ???

4

2 に答える 2

11

これは、 の出力printfが によってバッファリングされ、 の出力がバッファリングされlibcないwriteためです。これは、ファイル(stdout)に対する直接のバッファリングされていない操作です。

これを読んでください:

stdout が端末の場合、バッファリングは自動的に行バッファリングに設定され、それ以外の場合はバッファリングに設定されます

したがって、実際にパイプしていますcat-それがバッファリングが有効になっている理由です(表示せずcatに試してください)

バッファリングをオフにするには、次のstdbufコマンドを発行します。

stdbuf -o0 ./a.out  | cat 

ところで、これは日常的に C のハッカーではない人に尋ねるのに最適な質問です。シンプルでわかりやすい!

于 2013-04-27T23:44:05.543 に答える
4

hek2mgl が指摘したように、それはバッファリングが原因です。物事を強制したい場合はfflush(stdout)、の後に置くことができます。printf

于 2013-04-27T23:53:39.990 に答える