Перенаправить FROM stderr в другой файловый дескриптор - PullRequest
2 голосов
/ 23 февраля 2011

Моя программа вызывает библиотечные функции, которые печатают в stderr. Я хочу вмешаться, чтобы все вызовы записи в файловый дескриптор # 2 вместо этого отправлялись куда-то еще.

Вот моя первая попытка:

bool redirect_stderr (int fd)
{
    return dup2 (2, fd) > 0;
}

Здесь fd был успешно получен из open("/foo/bar",O_APPEND|O_CREAT)

После того, как эта функция вернет true, std::cerr<<"blah" отправляется в терминал, а не в файл.

Что я делаю не так?

Спасибо.

UPDATE

Спасибо, Ларсман, но я еще не там ...

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

в стандартный вывод, и данный файл пуст. (Он правильно создан, если его не существует.)

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Вы полностью изменили аргументы: это

dup2(from_fd, to_fd)

т.е.

dup2(fd, 2)

(см. POSIX.2008 или ваши man-страницы.)

0 голосов
/ 29 августа 2011

Просто для полноты: вы даже можете достичь своей цели с помощью freopen(name, mode, stderr), который является стандартной функцией / ANSI / ISO C89 и C99.

...