Umleitung von stderr in string



  • Hallo,
    versuche gerade moegliche stderr meldungen nach einem Systemaufruf durch eine umleitung von stderr abzufangen. Die Umleitung mit 2>&1 will ich nicht machen.
    Die Fehlermeldugnen sollen im Programm weiterverarbeitet oder in eine Logdatei geschrieben werden. Wie komme ich an den Stream ran?
    Bin fuer jeden Tipp dankbar!
    Gruss
    Joerg



  • Solange du nur die Fehlermeldung von Systemfunktionen haben willst, musst du kein stderr umleiten, dafür gibt es in string.h die Funktion strerror(), welche dir den String zur letzten Fehlermeldung liefert, welche in errno gespeichert ist. Die meisten Systemfunktionen liefern ein -1 und setzen errno im Fehlerfall, aber nicht alle - da musst du die Dokumentation der jeweiligen Funktion aufrufen...

    [cpp]
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //...
    char *fehler=(char*)malloc(100*sizeof(char));
    if(systemfunktion()==-1)
    fehler=strerror(errno);
    //...
    [/cpp]



  • RTC schrieb:

    [cpp]char *fehler=(char*)malloc(100*sizeof(char));
    if(systemfunktion()==-1)
    fehler=strerror(errno);
    [/cpp]

    errno hab ich zwar noch nie benutzt aber, dass das nicht das bewirkt was du dir vorstellst ist elementar.

    char *fehler=(char*)malloc(100);
    if(systemfunktion()==-1)
    	strncpy(fehler,strerror(errno),100);
    

    sizeof(char) kannst du weglassen da sizeof ja mit sizeof(char)==1 definiert ist.



  • Irgendwer schrieb:

    RTC schrieb:

    [cpp]char *fehler=(char*)malloc(100*sizeof(char));
    if(systemfunktion()==-1)
    fehler=strerror(errno);
    [/cpp]

    errno hab ich zwar noch nie benutzt aber, dass das nicht das bewirkt was du dir vorstellst ist elementar.

    Ja, hab nen Fehler: meinte natürlich Folgendes:

    char *fehler; 
    if(systemfunktion()==-1) 
        fehler=strerror(errno);
    

    Speicher wird ja von der Funktion bereit gestellt, hatte ich "vergessen", danke für den Hinweis...



  • btw: stderr umleiten (falls es noch jemanden interessiert) kann man mit freopen()



  • Hallo,
    habe das Problem nun doch mit einer temp-Dateui gelöst - so funtkionier es mit verschiedenen Systemaufrufen am besten. Vielen Dank für die Ideen!

    Gruss
    Joerg

    /** Hier mall ein code-Schnipsel **/

    int i;
    char command[1024];
    char line[1024] = "";
    char row[255];
    FILE *pp;
    char *temperrfname;
    FILE *err;

    ...

    /* Datei fuer stderr bauen */
    temperrfname = tmpnam(NULL);

    sprintf(line,"%s 2> %s",line,temperrfname);
    ...

    system_call(line,thOutput);
    ...

    /***********************************************************
    system_call
    ************************************************************/
    int system_call(char *command, ITAB Out) {

    int i = 0;
    char row[255];
    SPFLIST *tOut;
    FILE *pp;

    pp = popen(command,"r");
    if(pp == NULL) {
    tOut = ItAppLine(Out);
    SETCHAR(tOut->Line, "Could not open Pipe");
    } else {
    while(fscanf(pp, "%[ -~]%*[\n]", row) > 0) {
    tOut = ItAppLine(Out);
    SETCHAR(tOut->Line, row);
    }
    }
    pclose(pp);

    return (i);
    }


Anmelden zum Antworten