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.

    @DrGreenthumb

    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>&1

    Wie 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>&1

    Die 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
    joemu

    P.S. Und ob das jetzt Mist ist, darueber kann man streiten, hauptsache es funktioniert 😉


Anmelden zum Antworten