2

ファイルを使用して stdout と stderr の出力をリダイレクトしようとしています。freopen を使用しています。正しいディレクトリにファイルが作成されますが、ファイルは空白です。コードをコメントアウトして stdout と stderr をリダイレクトすると、コンソールに出力が表示されます。

コードは次のとおりです。

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);

メインに printf("I WORK") を配置しましたが、出力する抑制剤はありませんが、ファイルに書き込みません。

4

1 に答える 1

3

あなたがやろうとしていることをするために、私はdup2(2)を使用します。

fd1 と fd2 の 2 つのファイルを単純に open(2)dup2(fd1, 1)してから、stdout とdup2(fd2, 2)stderr に使用します。

OS (libc、ローダー、またはカーネルのいずれかは不明) は、main のエントリの前に 3 つのオープン ファイル記述子を設定します。

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

およびdup2のドキュメントから:

dup2(int oldfd, int newfd) newfd を oldfd のコピーにし、必要に応じて最初に newfd を閉じます。

したがって、2 つの dup2 呼び出しは、1 と 2 を開いているファイルに置き換えます。そのため、プロセスがwrite(2) (printf や cout 呼び出しなどのすべての出力ルーチンの syscall) を fd 1 または fd 2 に呼び出すと、データは OS によってセットアップされたパイプではなく、ファイルに書き込まれます。

マニュアルページの注意:

man ページは章で構成されています。foo(N)という表記は、第 N 章の「foo」という名前の man ページを意味します。foo(N) を開くには、次のように入力します。

$ man N foo

たとえば、write(2) タイプを開くには:

$ man 2 write
于 2012-03-28T21:07:42.727 に答える