c++ - 将 FROM stderr 重定向到另一个文件描述符

标签 c++ unix pipe stderr dup2

我的程序调用了打印到 stderr 的库函数。我想进行干预,以便所有对文件描述符 #2 的写入调用都将发送到其他地方。

这是我的第一次尝试:

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

这里,fd是从open("/foo/bar",O_APPEND|O_CREAT)成功获取到的

此函数返回真后,std::cerr<<"blah"转到终端而不是文件。

我做错了什么?

谢谢。

更新

谢谢,larsmans,但我还没有...

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

到标准输出,给定的文件是空的。 (如果不存在则正确创建。)

最佳答案

你颠倒了论点:它是

dup2(from_fd, to_fd)

dup2(fd, 2)

(参见 POSIX.2008 或您的联机帮助页。)

关于c++ - 将 FROM stderr 重定向到另一个文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5095839/

相关文章:

linux - unix管道过滤器的彩色控制台输出

c++ - 从可执行文件中找出编译优化标志

c++ - 为什么 std::transform 和类似的东西将 'for' 循环增量转换为 (void)?

linux - vi命令:s/1, $/ABC/CBS的含义?

perl - Perl 中的系统和反引号和管道之间有什么区别?

arrays - 在angular2中过滤数组

c++ - 存在循环依赖时 #include 的正确方法?

java - c++ 中的 clock() 时间与 java 中的 System.CurrentTimeMillis() 之间的时差

linux - 无法在 Ubuntu 14.04 LTS 上安装 libgdamm4.0-dev

我可以通过堆栈转储判断一个进程是被杀死还是它自己崩溃了吗?