私のプログラムは、stderr に出力するライブラリ関数を呼び出します。ファイル記述子 #2 へのすべての書き込み呼び出しが代わりに別の場所に送信されるように介入したいと考えています。
これが私の最初の試みです:
bool redirect_stderr (int fd)
{
return dup2 (2, fd) > 0;
}
ここで、fd は正常に取得されました。open("/foo/bar",O_APPEND|O_CREAT)
この関数が true を返した後std::cerr<<"blah"
、ファイルではなく端末に移動します。
私は何を間違っていますか?
ありがとう。
アップデート
ありがとう、ラーズマン、でも私はまだそこにいない...
void redirect_stderr_to (const char * output_file)
{
int fd = open (output_file, O_APPEND | O_CREAT, S_IRUSR | S_IWUSR);
if (fd < 0) {
throw RUNTIME_ERROR;
}
else {
if (-1 == dup2 (fd, STDERR_FILENO))
throw RUNTIME_ERROR;
std :: cout << (std::cerr ? "Fine\n" : "Bad\n");
char x [100];
std :: cerr
<< "Output to " << getcwd (x, 100) << " / " << output_file
<< " yields " << fd << " errno: " << errno << "\n";
std :: cout << (std::cerr ? "Fine\n" : "Bad\n");
}
}
これは出力します
Fine
Bad
stdout に送信され、指定されたファイルは空です。(存在しない場合は正しく作成されます。)