stdoutとstderrを同じファイルにリダイレクトして復元する 質問する

stdoutとstderrを同じファイルにリダイレクトして復元する 質問する

私は、C プログラムの stderr と stdout の出力を 2 つのファイルにリダイレクトし、元の stdout と stderr を復元しています。

int sout = dup(fileno(stdout));
freopen("test.txt","w",stdout);

int serr = dup(fileno(stderr));
freopen("test.txt","a",stderr);

//some output....

dup2(sout,fileno(stdout));
close(sout);

dup2(serr,fileno(stderr));
close(serr);

これがコードサンプルです。これで動作します。

しかし、stdout と stderr を同じファイルにリダイレクトして (後で再度復元して)、stderr と stdout をリダイレクトしていないときにコンソール出力でソートされるのと同じ順序で出力がソートされるようにしたいと思います。どうすればいいでしょうか?

ベストアンサー1

次のように、ファイルを再度開く代わりにstderr

freopen("test.txt","a",stderr);

stdout次のようにして、ファイル記述子レベルでリダイレクトします。

dup2(fileno(stdout), fileno(stderr));

stdoutとは依然として独立したユーザーレベルバッファを使用し、対話型端末に向けられていない場合はフラッシュルールが異なることに注意してくださいstderr。これがリダイレクト時に出力順序が異なる主な原因である可能性が高いです。フラッシングモードの説明およびのマニュアルページsetvbuf()

おすすめ記事