17

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

4

1 回答 1

16

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

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

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

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

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

于 2013-03-01T11:43:38.450 回答