streams von der Standardausgabe abfangen mit popen()

Dieses Thema im Forum "C/C++" wurde erstellt von x0r, 12.09.2006.

  1. x0r

    x0r Bitschubser

    Dabei seit:
    20.12.2005
    Beiträge:
    169
    Zustimmungen:
    0
    Ort:
    Berlin
    Mahlzeit,

    ich will eine API für das CGI entwickeln um z.Bsp.: start/stop-Scripte anstoßen zu können, Dateien zu erzeugen usw....

    Hilfreich, wenn man die Ausgaben der Anwendung zur Verfügung hat um das Ergebnis irgendwie zu visualisieren. Hab daher versucht zunächst die Ausgaben in txt-Dateien zu streamen und anschließend diese mittels filepointern ausgelesen.

    Jetzt möchte ich aber auch Pipes zwischen den Anwendungen aufbauen, und da wäre ja proc_open() eine gute Wahl, da ich ja auch schreibend auf die Standardeingabe zugreifen kann. Der Einfachheit halber habe ich zunächst versucht mit popen()
    ein Shellcommando abzusetzen ($/bin/ls -l), und dessen Ausgabe mittels fgets() in einen Puffer zu überführen der mir dann eben die Rückgabe als Klartext präsentiert.

    Hier mal ein Schnippslet:

    Code:
    FILE* CLI_httpd(const char* cstrParam)
    {	
    
    	void* cstrFullCMD = (char*)malloc(strlen(cstrParam)+strlen(" 2>/dev/null")+12);
    	
            strcpy(cstrFullCMD, "/bin/ls -l ");
    	strcat(cstrFullCMD, cstrParam);
    	strcat(cstrFullCMD, 	" 1>/dev/null\0");
    
    	return popen(cstrFullCMD, "r\0");		
    }
    
    
    soweit sogut, hier die Initialisierung des Puffer und die Überführung...
    Code:
    
    typedef int (*funcHandleType)(const char*);	// benutzerdefinierter Typ für ein Handle auf                               
                                                                       // Symbole in einer dynamischen Bibliothek
    
      
    int main() {
    
         funcHandleType funcHandle = dlsym(pvDLLHandle, HTTPD);  // symbolhandle gewinnen
                   ...          
    
         	        char* ThrdPuffer = NULL;
                   	fgets(ThrdPuffer, (sizeof((funcHandle)(SecPuffer))+1), stdout);
                   	printf("<br />Der R&uuml;ckgabestring: %s", ThrdPuffer); 
    
    
    So die Ausgabe ist aber jedesmal 'NULL', dabei sollte doch zumindes sowas wie "/bin/ls -l" eigentlich kein Problem darstellen ...

    Hab ich mich mit dem fgets() vielleicht vertan ?!
    Danke im Vorraus, MfG
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. theton

    theton Bitmuncher

    Dabei seit:
    27.05.2004
    Beiträge:
    4.820
    Zustimmungen:
    0
    Ort:
    Berlin, Germany
    Wenn ich das richtig verstanden habe, willst du jeglichen stdout in einer Log-Datei haben? Waere da nicht
    Code:
    #define LOG_FILE "/var/log/meinlog.log"
    ...
    fclose(stdout);
    freopen(LOG_FILE, "a", stdout);
    setbuf(stdout, NULL);
    
    wesentlich sinnvoller? Dann musst du nur immer den letzten Output aus der Datei holen, was sich z.B. dadurch vereinfachen laesst, dass du nach jedem abgesetzten Befehl einfach eine Markierung ins Log setzt, so dass du immer alles zwischen den letzten beiden Markierungen als Output rausholen kannst. Oder du ueberschreibst die Datei einfach mit jedem Befehl.
     
  4. #3 x0r, 12.09.2006
    Zuletzt bearbeitet: 12.09.2006
    x0r

    x0r Bitschubser

    Dabei seit:
    20.12.2005
    Beiträge:
    169
    Zustimmungen:
    0
    Ort:
    Berlin
    Negativ: genau dass habe ich ja zuvor gemacht.
    Es kostet aber mehr Taktzyklen erst einmal einen Stream in eine (meinthalben temporäre) Datei zu lenken, und diese erneut auszulesen. Bei multithread-Szenarien auf embedded Systemen (ist leider bei mir der Fall 8)) ist das extrem uncool...

    Der Trick ist ja, den ganzen Quatsch mit den Wrappern für Low/Level-Filepointer zu umgehen, und ein paar Zyklen Geschwindigkeit mehr rauszuholen.
    Prinzipell wäre es aber schon einfacher.

    EDIT: @theton danke für den Tipp, habs aber dann doch noch gelöst.

    Problem ist diese Zeile:

    Code:
    fgets(ThrdPuffer, (sizeof((funcHandle)(SecPuffer))+1), stdout);
    
    und
    Code:
    strcat(cstrFullCMD, 	" 1>/dev/null\0");
    
    Ich Dussel hab doch echt von der Standardausgabe gelesen, wo ich aus dem FILE*-Stream hätte lesen sollen :(
    Und viel schlimmer ist, dass ich versucht habe eine Stream zu lesen, den ich ja explicit nach /dev/null umgelenkt habe (peinlich8))
    naja, wieder was gelernt.
     
Thema:

streams von der Standardausgabe abfangen mit popen()

Die Seite wird geladen...

streams von der Standardausgabe abfangen mit popen() - Ähnliche Themen

  1. Webcam freeBSD für Streamserver

    Webcam freeBSD für Streamserver: Hi Forum Ich würde gerne eine Webcam an meinem freeBSD Server anschliessen, mit der ich dann über das Internet einen Stream ansehen kann. Im...
  2. Real Player Streams - Kein Fullscreen möglich

    Real Player Streams - Kein Fullscreen möglich: Hallo zusammen, Ich möchte mir gerne Videos auf CBS.com unter Ubuntu 7.04 ansehen und habe dafür auch schon alle notwendigen Vorkehrungen...
  3. streams die 2.

    streams die 2.: Kann ir jemand sagen ob (undwenn ja wie) man die Buffergrösse von BinaryReader/Writer ändern kann? Das Problem: Ich füttere einen externen...
  4. mplayer und (g)xine installiert - dennoch keine webstreams möglich

    mplayer und (g)xine installiert - dennoch keine webstreams möglich: Hallo - ich versuche im Moment Video-Streams auf meinem 64 Bit Suse 10.2 System zum Laufen zu bringen (ein spezielles Interesse besteht am...
  5. Amarok speilt keine ogg files/streams

    Amarok speilt keine ogg files/streams: Wie gesagt AmaroK spielt keine ogg streams und files, ich habe aber die libogg installiert, auch die libvorbis und die vorbis tools. Es sagt...