2013-03-01 14 views
12

sto reindirizzando l'output di stderr e stdout del mio programma C a due file e quindi il ripristino del stdout originale e stderr:Redirect stdout e stderr allo stesso file e ripristinarlo

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

Questo è il codice axample . Questo funziona.

Ma vorrei reindirizzare stderr e stderr sullo stesso file (e successivamente ripristinarlo di nuovo) in modo che l'output sia ordinato nello stesso ordine in cui è ordinato sull'output della console quando non reindirizza stderr e stdout. Come lo posso fare?

saluti

sw

risposta

12

Invece di aprire nuovamente il file per stderr, come in:

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

destinarli al stdout a livello di descrittore di file facendo:

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

Notare che stdout e stderr utilizzerà ancora buffer di livello utente indipendenti e, quando non diretti a un terminale interattivo, le regole di flussaggio sono diverse. Questa sarà probabilmente la causa principale di diversi ordinamenti di output quando vengono reindirizzati. Vedere this explanation of flushing modes e la pagina man per setvbuf().