freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
これは私のラウンドペグスクエアホールメーターの針をピークにしています。何を達成しようとしていますか?
編集:
stdin、stdout、および stderr は、新しく作成されたすべてのプロセスのファイル記述子 0、1、および 2 であることを思い出してください。freopen() は同じ fd を保持する必要があり、新しいストリームをそれらに割り当てるだけです。
したがって、これが実際にやりたいことを行っていることを確認する良い方法は次のようになります。
printf("Stdout is descriptor %d\n", fileno(stdout));
freopen("/tmp/newstdout", "w", stdout);
printf("Stdout is now /tmp/newstdout and hopefully still fd %d\n",
fileno(stdout));
freopen("/dev/stdout", "w", stdout);
printf("Now we put it back, hopefully its still fd %d\n",
fileno(stdout));
これは freopen() の予想される動作だと思います。ご覧のとおり、まだ 3 つのファイル記述子 (および関連するストリーム) しか使用していません。
シェルがリダイレクトするものがないため、これはシェルのリダイレクトをオーバーライドします。ただし、おそらくパイプを壊すでしょう。プログラムがパイプ (FIFO ではなく、パイプ) のブロック側にいる場合に備えて、SIGPIPE のハンドラーを設定することをお勧めします。
したがって、./your_program --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt は、freopen() を使用して簡単に実行でき、同じ実際のファイル記述子を維持できます。私が理解できないのは、一度変更したら元に戻す必要があるのはなぜですか?確かに、誰かがどちらかのオプションを渡した場合、プログラムが終了するまでそれを維持したいと思うでしょうか?