【问题标题】:Redirect FROM stderr to another file descriptor将 FROM stderr 重定向到另一个文件描述符
【发布时间】:2011-07-03 00:33:07
【问题描述】:

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

这是我的第一次尝试:

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

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

此函数返回 true 后,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

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

【问题讨论】:

  • 请在发布下一个问题之前接受一些答案。点击您之前问题的最佳答案旁边的复选标记。

标签: c++ unix pipe stderr dup2


【解决方案1】:

仅出于完整性考虑:您甚至可以使用 freopen(name, mode, stderr) 来实现您的目标,这是一个标准/ANSI/ISO C89 和 C99 函数。

【讨论】:

    【解决方案2】:

    你颠倒了论点:它是

    dup2(from_fd, to_fd)
    

    dup2(fd, 2)
    

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

    【讨论】:

    • 手册页上写着 int dup2(int oldfd, int newfd); 并且 2 是旧的 fd,不是吗?
    • 否:oldfd 是从中复制的 fd,newfd 是复制到的 fd。 (oldfdnewfd 不是很好的参数名称。这是 Linux 联机帮助页吗?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2014-07-22
    • 1970-01-01
    • 2018-10-05
    • 2011-12-28
    相关资源
    最近更新 更多