我想将流写入一个FILE * fp,同时将流复制到另一个fp上,是否有更好的方法通过消除一个fprintf来编写我的调试功能?
const int logflag=1;
#define debug(args ...) if (logflag) { FILE *flog = fopen("test.log", "a+"); fprintf( flog, args); fclose(flog); } fprintf(stderr, args);
int main()
{
debug("test"); // writes test into both stderr and flog
debug("test2");
}
答案 0 :(得分:1)
简短的回答是不,它是两个不同的文件指针,你一次只能写一个。实际上,dup
仍然无法帮助您,因为它会关闭重复的文件描述符:
"dup2() makes newfd be the copy of oldfd, closing newfd first if necessary"
from the dup2 man-pages
但是,如果您的目标是同时拥有屏幕和文件的日志,那么使用Linux已经提供的工具可以更好地为您提供服务。一般的好习惯(我不记得这个的来源)是让程序将其输出和调试打印到stdout
/ stderr
并让调用用户确定如何处理输出。
在此之后,如果您的所有输出都转到stderr
,则可以在执行程序时执行以下操作:
$ ./program 2>&1 | tee file.log