0

ストリームを 1 つの FILE *fp に書き込み、同時にストリームを別の fp にコピーしたいのですが、fprintf を 1 つ削除してデバッグ関数を作成するより良い方法はありますか?

const int logflag=1;
#define debug(args ...) if (logflag) { FILE *flog = fopen("test.log", "a+"); fprintf( flog, args); fclose(flog); } fprintf(stderr, args); 

int main()
{

    debug("test"); // writes test into both stderr and flog 
    debug("test2");
}
4

1 に答える 1

1

簡単な答えはノーです。これは2つの異なるファイルポインタであり、一度に書き込むことができるのは1つだけです。実際にdupは、複製されたファイル記述子を閉じるため、それでも役に立ちません。

"dup2() makes newfd be the copy of oldfd, closing newfd first if necessary"

from the dup2 man-pages

ただし、画面とファイルの両方にログを記録することが目標である場合は、Linuxがすでに提供しているツールを使用する方が適切です。一般的に良い習慣(これのソースを覚えていません)は、プログラムにその出力とデバッグをstdout/に出力stderrさせ、呼び出し元のユーザーに出力の処理方法を決定させることです。

これに続いて、すべての出力がに送られるstderr場合、プログラムの実行時に次のことを実行できます。

$ ./program 2>&1 | tee file.log
于 2013-01-24T22:31:52.803 に答える