我将我的c程序的stderr和stdout的输出重定向到两个文件,然后恢复原始的stdout和stderr:
int sout = dup(fileno(stdout));
freopen("test.txt","w",stdout);
int serr = dup(fileno(stderr));
freopen("test.txt","a",stderr);
//some output....
dup2(sout,fileno(stdout));
close(sout);
dup2(serr,fileno(stderr));
close(serr);
这是代码示例。这有效。
但我想将stdout和stderr重定向到同一个文件(稍后再次恢复),以便在不重定向stderr和stdout时,输出的排序顺序与在控制台输出上排序的顺序相同。我怎么能这样做?
答案 0 :(得分:14)
而不是为stderr
再次打开文件,如:
freopen("test.txt","a",stderr);
通过执行以下操作将其重定向到文件描述符级别的stdout
:
dup2(fileno(stdout), fileno(stderr));
请注意,stdout
和stderr
仍将使用独立的用户级缓冲区,并且在未定向到交互式终端时,刷新规则不同。这很可能是重定向时输出顺序不同的主要原因。请参阅this explanation of flushing modes和setvbuf()
的手册页。