2012-03-28 7 views
2

stdoutとstderrの出力をファイルを使ってリダイレクトしようとしています。私はfreopenを使用しており、正しいディレクトリにファイルを作成しますが、ファイルは空白です。 stdoutとstderrをリダイレクトするコードをコメントアウトすると、出力がコンソールに表示されます。私がメインで、それはしかし、文句を言わないファイルへの書き込み出力抑制剤なしのprintf(「私は仕事」)に置かれているfreopenが指定されたファイルに書き込みを行っていません

freopen(stderrStr.c_str(), "a+", stderr); //where stderrStr and stdoutStr are the path/file name 
freopen(stdoutStr.c_str(), "a+", stdout); 

fclose(stdout); 
fclose(stderr); 

:ここ

はコードです。

+0

stdoutまたはstderrを決して閉じないで、プログラム終了時に自動的に閉じます。 –

+0

@dark_charlie私はhttp://www.cplusplus.com/reference/clibrary/cstdio/freopen/ から例を得ました。私はそれらのクローズド・ステートメントをコメントしました。 – user1185853

答えて

3

あなたがしようとしていることを行うために、私はdup2(2)を使用します。その後、

単にオープン(2) 2つのファイルFD1とFD2とstdoutとstderrのためdup2(fd2, 2)ためdup2(fd1, 1)を使用しています。

OS 3つのオープンファイルディスクリプタのメインの入り口の前に設定します(libcの、ローダーまたはカーネル、どのわからない):

0 : stdin pipe 
1 : stdout pipe 
2 : stderr pipe 

とdup2ののドキュメントから:

dup2の(int型oldfdが、int型newfd)は

必要に応じてその2つのdup2の呼び出しは、開いているファイルを1と2を交換する最初のnewfdを閉じ、newfd oldfdがコピー可能になります。したがって、プロセスがwrite(2)(printfやcoutなどのsyscallのすべての出力ルーチン)をfd 1またはfd 2にコールすると、データはOSによって設定されたパイプにではなくファイルに書き込まれます。

マニュアルページノート

マニュアルページが付属しています。表記のfoo(N)がfoo(N)型を開くには章N.で "foo" という名前のmanページを意味します。書き込みを開くために、たとえば

$ man N foo 

は(2)を入力します。

$ man 2 write 
関連する問題