2013-03-01 3 views
12

Я перенаправив вывод STDERR и STDOUT моей гр программы для двух файлов, а затем восстанавливая исходный стандартный вывод и стандартный поток ошибок:Перенаправление стандартный вывод и стандартный поток ошибок в тот же файл и восстановить его

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. Как я могу это сделать?

С уважением

ЕО

ответ

12

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

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

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

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

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