将stdout和stderr重定向到同一文件并将其还原

时间:2013-03-01 10:20:48

标签: c redirect stdout output stderr

我将我的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时,输出的排序顺序与在控制台输出上排序的顺序相同。我怎么能这样做?

1 个答案:

答案 0 :(得分:14)

而不是为stderr再次打开文件,如:

freopen("test.txt","a",stderr);

通过执行以下操作将其重定向到文件描述符级别的stdout

dup2(fileno(stdout), fileno(stderr));

请注意,stdoutstderr仍将使用独立的用户级缓冲区,并且在未定向到交互式终端时,刷新规则不同。这很可能是重定向时输出顺序不同的主要原因。请参阅this explanation of flushing modessetvbuf()的手册页。