Ubuntu 20
、Bash 5
。
私が何か愚かなことを見落としたかもしれません!ロギングにおよびをfoo
使用するC ++バイナリがあります。std::cout
printf()
puts()
./foo
端末で実行すると、一部の出力(および分割エラー)が発生します。
すべてをリダイレクトすると、./foo > log
出力の一部のみが表示されます。期待どおり./foo 1>one 2>two
then を伝播すると、短縮されたone
出力が含まれ、two
何も含まれません。
(明らかに)中央ロギング機能がないため、強制的に更新する方法を想像することはできません。
何が間違っている可能性がありますか?
$./foo
text1
text2
$./foo > log ; cat log
text1
答え1
ロギングはこれとは無関係で、学ぶ必要があるCおよびC ++プログラミングの基本的な側面です。
標準 I/O ライブラリー・ルーチンは、ランタイム・ライブラリーが標準出力が端末装置ではないと判断したため、出力を完全にバッファーします。 stdout ラインバッファリングが必要な場合は、setvbuf()
stdout が Bernstein などのツールを使用する端末であることを C ランタイムライブラリに確認するか、ptybandage
C ライブラリの特殊フックを使用してコードを使用してラインバッファリングをオンにする方法でコードからラインバッファリングをオンにすることができます。注入ツール、例えば、ここではおそらく最良のオプションstdbuff
です。ptybandage
非侵襲的で、おそらく行うことができますいいえ標準 I/O バッファリングの特性を正しく理解したら、プログラムで明示的なバッファオーバーライドを実装したいと思います。
ところで標準出力には記録しないでください。にログインしてくださいstd::clog
。