stdout und stderr in gleiche datei umleiten
-
Hallo zusammen!
Wie kann ich stdout und stderr in die gleiche Datei umleiten?
Einzeln funktioniert es mit:Orig_STDOUT = dup(1); // fuer spaeter logfile = freopen(name_logfile, "wb", stdout); setvbuf(logfile, NULL, _IONBF , 0); //ungepuffert bei stdout
Hab's schon mit
system("2>&1");
probiert, hat aber keine Wirkung. Moeglichkeit waere vielleicht
printf("Error: %s\n",strerror(errno));
bei Fehlern anstatt perror(), aber ist auch nicht gerade das gelbe vom Ei
Kennt jemand ne Loesung?
Gruss aus Australien
joemu
-
close(2); dup(1);
Das ist jetzt kein ANSI C mehr, aber da du oben eh schon dup() benutzt...
Bei meinem Test gerade hats so funktioniert, weiß aber nicht ob das auch wirklich ganz mit rechten Dingen zugeht.
Aber, warum sollte man sowas überhaupt wollen??
Die getrennten Ströme gibts ja nicht umsonst.
-
Das Programm steuert einen schnellen 2D-Laserscanner und gibt die Daten ueber Ethernet an eine uebergeordnete Steuerung weiter. Das ganze laeuft auf einer kleinen Linux-Box von einer CompactFlash-Karte, wobei ich nur Zugriff ueber ssh und sftp habe. Daher sollen alle Status- und Fehlermeldungen in ein Logfile geschrieben werden.
Wie ist das mit dem close() gemeint, einfach den stderr-Stream vorher zumachen?
Wohin geht die Ausgabe dann?
Ich hab's probiert, es aendert sich aber irgendwie gar nichts, die Ausgaben
von perror() kommen trotzdem noch auf den Bildschirm.MFG
joemu
-
joemu schrieb:
Das Programm steuert einen schnellen 2D-Laserscanner und gibt die Daten ueber Ethernet an eine uebergeordnete Steuerung weiter. Das ganze laeuft auf einer kleinen Linux-Box von einer CompactFlash-Karte, wobei ich nur Zugriff ueber ssh und sftp habe. Daher sollen alle Status- und Fehlermeldungen in ein Logfile geschrieben werden.
Ruf das Programm über ein shellscript auf:
#!/bin/sh
prog >logfile 2>&1Wie ist das mit dem close() gemeint, einfach den stderr-Stream vorher zumachen?
Wohin geht die Ausgabe dann?close() schließt den stderr-stream und dup() dubliziert den stdout-Stream.
man dup schrieb:
dup uses the lowest-numbered unused descriptor for the new descriptor.
Was dann wiederum stderr (2) ist. Also hast du quasi 2 stdouts und kein stderr mehr.
Ich hab's probiert, es aendert sich aber irgendwie gar nichts, die Ausgaben
von perror() kommen trotzdem noch auf den Bildschirm.Die Ausgaben sollten dahin gehen, wo die von stdout hingehen...
Jedenfalls funktioniert das hier:~% cat a.c #include <stdio.h> int main() { close(2); dup(1); perror("hallo"); } ~% gcc a.c ~% ./a.out >/dev/null ~%
Aber wie gesagt, eigentlich alles mist
Nimm einfach das wrapper-shellscript.
-
Ruf das Programm über ein shellscript auf:
#!/bin/sh
prog >logfile 2>&1Die Moeglichkeit kenn ich, das Programm wird sowieso ueber das Startscript aufgerufen. Das Problem ist aber dabei, das stdout gepuffert wird, d.h. bei einem Abbruch ueber Ctrl-C fehlen u.U. die Ausgaben oder sind in der falschen Reihenfolge.
Jedenfalls funktioniert das hier:
~% cat a.c #include <stdio.h> int main() { close(2); dup(1); perror("hallo"); } ~% gcc a.c ~% ./a.out >/dev/null ~%
Ja, das funktioniert, hat aber wieder das Problem, dass die Ausgaben gepuffert werden.
Ich hab das Problem bei meinem Programm aber jetzt gefunden!
Man muss zuerst die Datei mit freopen() oeffnen, dann den stdout ungepuffert machen und erst dann close() und dup().
Ungefaehr so:logfile = freopen(name_logfile, "wb", stdout); setvbuf(logfile, NULL, _IONBF , 0); close(2); dup(1); perror("error"); printf("hallo");
Dann kommen alle Ausgaben schoen der Reihe nach und sofort ins Logfile.
Auf jeden Fall vielen Dank fuer die schnelle Hilfe!
Gruss aus Australien
joemuP.S. Und ob das jetzt Mist ist, darueber kann man streiten, hauptsache es funktioniert