追加読書

追加読書

Ubuntu 20Bash 5

私が何か愚かなことを見落としたかもしれません!ロギングにおよびをfoo使用するC ++バイナリがあります。std::coutprintf()puts()

./foo端末で実行すると、一部の出力(および分割エラー)が発生します。

すべてをリダイレクトすると、./foo > log出力の一部のみが表示されます。期待どおり./foo 1>one 2>twothen を伝播すると、短縮されたone出力が含まれ、two何も含まれません。

(明らかに)中央ロギング機能がないため、強制的に更新する方法を想像することはできません。

何が間違っている可能性がありますか?


$./foo
text1
text2

$./foo > log ; cat log
text1

答え1

ロギングはこれとは無関係で、学ぶ必要があるCおよびC ++プログラミングの基本的な側面です。

標準 I/O ライブラリー・ルーチンは、ランタイム・ライブラリーが標準出力が端末装置ではないと判断したため、出力を完全にバッファーします。 stdout ラインバッファリングが必要な場合は、setvbuf()stdout が Bernstein などのツールを使用する端末であることを C ランタイムライブラリに確認するか、ptybandageC ライブラリの特殊フックを使用してコードを使用してラインバッファリングをオンにする方法でコードからラインバッファリングをオンにすることができます。注入ツール、例えば、ここではおそらく最良のオプションstdbuffです。ptybandage非侵襲的で、おそらく行うことができますいいえ標準 I/O バッファリングの特性を正しく理解したら、プログラムで明示的なバッファオーバーライドを実装したいと思います。

ところで標準出力には記録しないでください。にログインしてくださいstd::clog

追加読書

関連情報