2013-03-01 12 views
12

ja przekierowując wyjście stderr i stdout w moim programie C do dwóch plików, a następnie przywraca pierwotny stdout i stderr:przekierowanie stdout i stderr do tego samego pliku i przywrócić go

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); 

To axample kod . To działa.

Ale chciałbym przekierować stdout i stderr do tego samego pliku (i później przywrócić go ponownie), aby dane wyjściowe były posortowane w tej samej kolejności, w jakiej są sortowane na wyjściu konsoli, gdy nie przekierowują stderr i stdout. Jak mogę to zrobić?

Pozdrowienia

sw

Odpowiedz

12

Zamiast otwierania pliku ponownie stderr, jak w:

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

przekierować go do stdout na poziomie deskryptora pliku, wykonując:

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

Pamiętaj, że stdout i stderr nadal będzie używać niezależnych buforów poziomu użytkownika, a gdy nie będzie skierowany na terminal interaktywny, reguły przepłukiwania będą różne. Będzie to najprawdopodobniej główna przyczyna dla różnych kolejności wyjściowych po przekierowaniu. Zobacz this explanation of flushing modes i stronę podręcznika dla setvbuf().

Powiązane problemy