我的程序调用打印到标准错误的库函数。我想进行干预,以便所有对文件描述符 #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
到标准输出并且给定的文件是空的。(如果不存在,则正确创建。)