LD_PRELOADで他プロセスのバッファリング無効化

pipepopen を使っていると、本来なら出力済みのはずの他プロセスの出力がなかなか取得できないことがある。
最初はpopenやpipeのせいかと思っていろいろ調べたけど、どうも出力時のバッファリングの影響のようだ。


自分のプログラム中でバッファリングの方法を変更するのは setvbuf でできるわけだけど、
これを LD_PRELOAD と組み合わせると他プロセスのバッファリング方法を変更できそう。


というわけで、以下他プロセスに読み込ませる共有ライブラリのソース。

#include <stdio.h>

namespace {
struct NoBuffer {
	NoBuffer() {
		setvbuf(stdout, NULL, _IONBF, 0);
	}
} instance;
}

おそらく大抵の Linux 環境で動くと思うけど、未保証ということで。


後はこれを適当なファイル(ここでは nobuf.cpp とする)に保存して、

$ g++ -fPIC -shared -O2 -o libnobuf.so nobuf.cpp

とすれば共有ライブラリ(ここでは libnobuf.so)のできあがり。

$ LD_PRELOAD=(適切なパス)/libnobuf.so コマンド

とすれば他のプロセスのバッファリングを無効にできるはず。


LD_PRELOAD 初めて使ったけど、いろいろと面白いことできそう。