10

出力を標準出力に出力するクローズドソースプログラムがあります。出力を解析する必要があります。そのため、dup2 を使用して出力を fifo にリダイレクトし (そこから、バイナリをフォークして実行する親プロセスを読み取ることができます)、プログラムを実行します。問題は、現在ファイルに書き込みを行っているため、ファイル内の fprintf 呼び出しがバッファリングされることです。

exec を呼び出す前に、stdout で _IONBF を使用して setvbuf を呼び出してみました。しかし、問題はまだ存在します。

私の場合、setvbuf が役に立たないのはなぜですか?

出力を強制的にフラッシュするにはどうすればよいですか?

4

3 に答える 3

6

setvbuf()OSの一部ではなく、Cランタイムライブラリの一部の状態を変更するため、違いはありません。新しいプロセスの実行が開始されると、そのCランタイムライブラリが再初期化されます(つまり、CRTを使用している場合です!)

これを回避するために私が聞いた唯一の方法は、どういうわけかプロセスの端末を偽造することです。これは、ほとんどのCRTライブラリは、インタラクティブ端末に接続されていると信じる場合(Unixの世界では:isatty()ファイル記述子でtrueを返す場合)、デフォルトで行バッファリングのみを実行しますが、それ以外の場合は、より大きなブロック(通常は8Kb程度)でバッファリングするためです。 )。

このユーティリティは、開始するのにかなり良い場所のように見えます。(Trick a applicationに関するコメントから借りて、そのstdinはインタラクティブであり、他の有用な情報を持っているパイプではないと考えています。)

于 2010-01-13T10:38:11.430 に答える
2

unbufferツールは、この問題を支援できます。

これはの一部であり、expect-dev次を使用してubuntuにインストールできます

sudo apt-get install expect-dev

使用するには、次のように入力します。

unbuffer ls > log.txt
于 2013-06-06T10:21:24.300 に答える