Перенаправить stdout и stderr в тот же файл и восстановить его

Я перенаправляю вывод stderr и stdout моей c-программы на два файла, а затем восстанавливаю исходный 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);

То, что код axample. Это работает.

Но я хотел бы перенаправить stdout и stderr в один и тот же файл (и позже восстановить его снова), чтобы результат сортировался в том же порядке, что и сортировка на выходе консоли, если не перенаправлять stderr и stdout. Как я могу это сделать?

Привет

SW

Ответ 1

Вместо того, чтобы снова открыть файл для stderr, как в:

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

перенаправить его на stdout на уровне дескриптора файла, выполнив:

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

Обратите внимание, что stdout и stderr будут по-прежнему использовать независимые буферы уровня пользователя и, если они не направлены на интерактивный терминал, правила сброса различны. Это, скорее всего, будет основной причиной для разных порядков вывода при перенаправлении. См. это объяснение режимов промывки и справочную страницу для setvbuf().