2011-09-02 21 views
5

Esto parece un poco una pregunta de sistemas informáticos 101, pero estoy perplejo.¿Captura/redirecciona internamente stdout?

Estoy integrando el código existente del proyecto C/C++ A en mi propio proyecto B. Tanto A como B se vincularán en un solo proceso ejecutable y enhebrado. El código del Proyecto A hace un uso extensivo de printf para la salida. Esto está bien, pero también quiero capturar esa salida en mis propios buffers. ¿Hay alguna manera de que pueda leer desde stdout una vez que las llamadas printf han escrito? No puedo bifurcar el proceso o la tubería. Y mis esfuerzos para sondear() stdout, o dup(), no han tenido éxito (puedo estar haciendo algo mal aquí).

+0

¿No puedes conectar la salida de A a B? ('$ commandprompt> ./A |./B'). Supongo que ambos son ejecutables y que A puede ejecutarse antes que B –

+0

Parece que quieres mantenerlos como ejecutables seprate y luego usar un conducto para conectarlos en tiempo de ejecución. –

+0

Lamentablemente, no. A y B deben vincularse a un solo ejecutivo. – MapMaker

Respuesta

4

Puede utilizar freopen para cambiar el descriptor.

#include<stdio.h> 

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

Si ejecuta eso, verá la salida printf en output.txt y nada irá a su pantalla.

Ahora puede abrir el archivo para leer los datos o incluso mmap en su espacio de memoria y procesarlo de esa manera.

0

Una vez que se ha apagado, se ha ido. Si desea compilarlo todo en un solo ejecutable, tendrá que pasar por el código de A con una búsqueda y reemplazar y cambiar todas esas llamadas printf por otras a su propia transmisión, donde puede copiarlas y luego pasarlas a stdout.

+0

Nick, este hecho fue el trabajo en torno he implementado, pero tenía la esperanza de que simplemente estaba haciendo algo mal con poll() y dup(). ¡Ah, es hora de avanzar! Gracias por la respuesta. Por cierto, me gusta tu ícono :) – MapMaker

+0

Se enrojeció y se fue para hacer su trabajo. La idea de pipes y stdout es que las aplicaciones no mantienen estas cosas; almacenan tanto como necesiten, luego se deshacen de él inmediatamente. De esta manera, las aplicaciones de tuberías juntas no requieren mucha memoria. No hay forma de conseguirlo si diseñas las cosas para que toda la producción anterior se mantenga para su uso posterior. –

+0

Siempre se puede hacer '#define printf (...) fprintf (miarchivo, __VA_ARGS __)' –

2

Antes de printf(), se puede cerrar fd 1, y dup2() una tubería que ha creado en fd 1.

+0

... y ni siquiera es necesario cerrar fd 1 - 'dup2' lo haría por usted. – dragonroot

1

Sin mencionar: ahora hay una útil biblioteca de código fuente U-Streams C que hace que redireccionar stdout y stderr sea bastante trivial. E incluso puede redirigirlos fácilmente a múltiples destinos. Además, puede crear sus propias transmisiones, además de que se pueden usar exactamente de la misma manera en que se comportan stdout y stderr.

Busque la Biblioteca C de U-Streams ... muy útil.