2013-03-01 5 views
12

ich die Ausgabe von stderr und stdout mein C-Programm in zwei Dateien und dann das Original stdout und stderr Wiederherstellung an Umleitung:umleiten stdout und stderr auf die gleiche Datei und wiederherstellen

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

Das ist der Code axample . Das funktioniert.

Aber ich würde stdout und stderr auf die gleiche Datei umleiten (und später wieder wiederherstellen), so dass die Ausgabe in der gleichen Reihenfolge sortiert wird, wie es in der Konsolenausgabe sortiert wird, wenn stderr und stdout nicht umgeleitet werden. Wie kann ich das machen?

Grüße

sw

Antwort

12

Statt Öffnen der Datei wieder für stderr, wie in:

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

umleiten zu stdout an der Dateideskriptor Ebene, indem Sie:

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

Beachten Sie, dass stdout und stderr verwendet weiterhin unabhängige Benutzerlevelpuffer, und wenn sie nicht an ein interaktives Terminal gerichtet sind, sind die Löschregeln unterschiedlich. Dies wird höchstwahrscheinlich der Hauptgrund für eine unterschiedliche Reihenfolge bei der Ausgabe sein. Siehe this explanation of flushing modes und die Manpage für setvbuf().