将stderrredirect到另一个文件描述符

我的程序调用打印到stderr的库函数。 我想介入,以便所有写入文件描述符#2的调用将被发送到别的地方。

这是我第一次尝试:

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

在这里,fd是从open("/foo/bar",O_APPEND|O_CREAT)

在这个函数返回true后, std::cerr<<"blah"进入terminal而不是文件。

我究竟做错了什么?

谢谢。

UPDATE

谢谢,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 

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

你扭转了这个观点:是的

 dup2(from_fd, to_fd) 

 dup2(fd, 2) 

(请参阅POSIX.2008或您的手册。)

只是为了完整性:甚至可以用freopen(name, mode, stderr)实现你的目标,这是一个标准/ ANSI / ISO C89和C99函数。