【发布时间】:2013-08-07 19:33:12
【问题描述】:
我想做的事
从 c++ 内部将 stdout 和 stderr 重定向到一个或多个文件
我为什么需要它
我正在使用一个外部的、预编译的第三方库,它会产生大量的输出,我想将其重定向到一个日志文件以保持控制台清洁。
条件
兼容性不是问题,代码只能在 Unix 系统上运行。重定向不仅应该影响 c++ 样式的打印 (std::cout << "hello world" << std::endl),还应该影响 c 样式的打印 (printf("hello world\n"))。
到目前为止我已经尝试过什么
我在stackoverflow上浏览了半天,阅读了许多有类似问题的人的答案。在这些答案的帮助下,我已经能够整理出以下代码:
#include <stdio.h>
#include <iostream>
#include <fcntl.h>
#include "unistd.h"
const int stdoutfd(dup(fileno(stdout)));
int redirect_stdout(const char* fname){
fflush(stdout);
int newstdout = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdout, fileno(stdout));
close(newstdout);
}
int restore_stdout(){
fflush(stdout);
dup2(stdoutfd, fileno(stdout));
close(stdoutfd);
return stdoutfd;
}
int main(){
redirect_stdout("/dev/null");
std::cout << "invisible 1" << std::endl;
restore_stdout();
std::cout << "visible 1" << std::endl;
redirect_stdout("/dev/null");
std::cout << "invisible 2" << std::endl;
restore_stdout();
std::cout << "visible 2" << std::endl;
return 0;
}
我希望看到的:
visible 1
visible 2
我实际看到的
visible 1
也就是说,当第一次使用这个机制时,它可以工作 - 但如果再次使用,恢复输出将不起作用。 有人可以向我指出我需要改变什么才能让机制无限频繁地工作吗?
【问题讨论】:
标签: c++ c io file-descriptor io-redirection