2

私のプログラムは、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 に送信され、指定されたファイルは空です。(存在しない場合は正しく作成されます。)

4

2 に答える 2

2

あなたは議論を逆転させました:それは

dup2(from_fd, to_fd)

すなわち

dup2(fd, 2)

POSIX.2008またはマニュアルページを参照してください。)

于 2011-02-23T19:15:30.010 に答える
0

freopen(name, mode, stderr)完全を期すために: Standard/ANSI/ISO C89 および C99 関数である を使用して目標を達成することもできます。

于 2011-08-29T18:29:12.180 に答える