stdout umbiegen/wiederherstellen



  • Hi,

    ich hab folgendes Problem: Ein Konsolenprogramm (ein cgi für Apache) ruft eine externe Lib auf. Diese Lib verhält sich aber nicht sehr nett und gibt 2 Zeilen auf stdout mittels printf aus. Das möchte ich verhindern, weil sich diese beiden Zeilen absolut nicht mit XHTML vertragen.
    Die beiden Zeilen sind immer die selben (Pfade zu 2 DLLs), daher hab ich folgenden Ansatz:

    freopen("dummy.txt", "w", stdout);
    
    /* ... Am Ende des Programms: */
    /* dummy.txt öffnen und die beiden unerwünschten Zeilen rausfiltern */
    /* Danach ausgeben */
    

    Das Ausgeben am Schluss ist das Problem. Durch freopen wird stdout geschlossen, d.h. der ganze Ansatz ist eigentlich sinnlos. 😞
    Wie kann ich stdout umbiegen, sodass entweder die externe Lib gar nichts mehr ausgeben kann oder dass alle Ausgaben zum späteren Filtern gespeichert werden?



  • ich koennte dir ne unix variante sagen, weiss aber nicht, ob
    dir das wirklich weiterhilft:

    int fd = open( "irgendwo.txt", ...);
    
    /* Das umlenken der ausgabe:
     * alle ausgaben auf stdout werden nun in die Datei geschrieben
     */
    dup2( fd, 1 ); /* 1 = filedescriptor stdout */
    
    printf( "Hallo Welt" ); /* wird in die Datei geschrieben */
    
    close( fd );
    


  • Danke, mit dup2 hast du mich auf die richtige Spur gebracht:

    FILE* my_stdout = _fdopen(_dup(1), "a");
    freopen("dummy.txt", "wb", stdout);
    
    /* ... */
    
    fclose(stdout);
    FILE* Result = fopen("dummy.txt", "rb");
    char Buffer[1024];
    while(!feof(Result))
    {
    	memset(Buffer, 0, 1024);
    	fread(Buffer, 1, 1023, Result);
    	fprintf(Buffer);
    }
    

    Ist vielleicht nicht alles Standard-C, aber es funktioniert mit Apache. 🙂


Anmelden zum Antworten