2011-09-02 3 views
5

Questo sembra un po 'una questione di sistemi informatici, ma sono perplesso.Catturare/reindirizzare internamente lo stdout?

Sto integrando il codice esistente dal progetto C/C++ A nel mio progetto B. Sia A che B saranno collegati in un singolo processo eseguibile, filettato. Il codice del progetto A fa ampio uso di printf per l'output. Questo va bene, ma voglio anche catturare quell'output nei miei buffer. C'è un modo per leggere dallo stdout una volta che le chiamate printf sono state scritte su di esso? Non posso biforcare il processo o la pipa. E i miei tentativi di interrogare() stdout, o di duplicarlo, non sono riusciti (forse sto facendo qualcosa di sbagliato qui).

+0

Non puoi collegare l'output di A in B? ('$ commandprompt> ./A |./B'). Suppongo che entrambi siano eseguibili e che A possa essere eseguito prima di B –

+0

Suoni come se si desidera mantenerli come eseguibili seprati quindi utilizzare una pipe per collegarli in fase di runtime. –

+0

Purtroppo no. A e B devono collegarsi in un singolo exec. – MapMaker

risposta

4

È possibile utilizzare freopen per modificare il descrittore.

#include<stdio.h> 

main(int argc, char** argv) { 
    FILE *fp = freopen("output.txt", "w", stdout); 
    printf("Hello\n"); 
    fclose(fp); 
} 

Se corri, vedrai l'output di printf in output.txt e nulla verrà visualizzato sullo schermo.

È ora possibile aprire il file per leggere i dati oppure è possibile inserire anche mmap nello spazio di memoria e elaborarlo in questo modo.

0

Una volta spento, non c'è più. Se vuoi compilarlo tutto in un unico eseguibile, dovrai passare attraverso il codice per A con una ricerca e sostituire e cambiare tutte quelle chiamate printf in quelle del tuo stream, dove puoi copiarle e poi passarle su stdout.

+0

Nick, questo infatti è stato il work-around ho implementato, ma speravo che stavo semplicemente facendo qualcosa di sbagliato con il poll() e dup(). Ah bene, è ora di andare avanti! Grazie per la risposta. a me piace la tua icona :) – MapMaker

+0

È arrossito e si spegne per fare la sua cosa. L'intera idea di pipe e stdout è che le applicazioni non mantengono queste cose in giro; loro bufferano quanto hanno bisogno, quindi liberarsene immediatamente. In questo modo le applicazioni di piping non richiedono molta memoria. Non c'è modo di ottenerlo se si progettano le cose in modo che tutti gli output precedenti restino in attesa di essere utilizzati in seguito. –

+0

Si può sempre fare '#define printf (...) fprintf (myfile, __VA_ARGS __)' –

2

Prima di printf(), si potrebbe chiudere fd 1, e dup2() un tubo che hai creato in fd 1.

+0

... e non c'è nemmeno bisogno di chiudere fd 1 - 'dup2' lo farebbe per te. – dragonroot

1

Per non parlare: c'è ora una libreria di codice sorgente U-Streams utile che rende il reindirizzamento di stdout e stderr piuttosto banale. E puoi anche reindirizzarli molto facilmente a più destinazioni. E, puoi creare i tuoi stream oltre a quelli che possono essere usati esattamente nello stesso modo in cui si comportano stdout e stderr.

Cerca la libreria C U-Streams ... a portata di mano.