将stdout和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时在控制台输出上排序的顺序相同的顺序排序。 我怎样才能做到这一点?

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

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

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

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

请注意, stdoutstderr仍将使用独立的用户级缓冲区,并且当不指向交互式终端时,刷新规则是不同的。 这很可能是重定向时输出顺序不同的主要原因。 请参阅刷新模式的说明和setvbuf()的手册页。