17

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 をリダイレクトしない場合にコンソール出力でソートされるのと同じ順序で出力がソートされるようにしたいと考えています。どうやってやるの?

4

1 に答える 1

16

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

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

stdout次の手順を実行して、ファイル記述子レベルでリダイレクトします。

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

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

于 2013-03-01T11:43:38.450 に答える