我的程序调用打印到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函数。