既知のPIDを使用して実行中のプロセスのパイプ/printfバッファを外部からフラッシュします。

既知のPIDを使用して実行中のプロセスのパイプ/printfバッファを外部からフラッシュします。

データロギングアプリケーションを作成していますが、すべてが次のように始まります。

./program > out.bin

データコレクタは定期的にstdout出力ファイルを集計し、データを読み込みます。

問題は、IOストリームがバッファリングされ、一部のプログラムが毎秒1バイトでデータを出力する場合、実際にデータをフラッシュするのに長い時間(デフォルトの4kBバッファサイズ、最大4k秒)がかかることです。

私の質問は、stdout / pipe / printfバッファを外部から強制的にフラッシュする方法です。つまり、fflush(stdout)

私は次のような様々なウェブサイトを読みました。パイプラインでバッファリングをオフにするただし、IOパフォーマンス(測定)に大きな影響を与えるため、バッファを無効にすることはできません。

私は高性能生産ソリューションを探しており、常に次の基準を満たしています。

  • プログラム(データプロデューサー)PIDは常に知られています。
  • 出力は常に既知のパスを持つファイルです。
  • データロギングプロセスには完全なルートアクセス権があります。

ベストアンサー1

gdb -p PID -batch -ex 'p fflush(stdout)'

すべてのデバッグとハッキングと同様に、YMMV。

おすすめ記事