
alessandroempire
Estoy trabajando con un programa multihilo.
Primero redirijo mi salida estándar a un archivo determinado. No hay problema allí (usé dup2(fd, 1)
donde fd
es el descriptor de archivo para el archivo).
Luego, necesito redirigir mi salida estándar a la terminal nuevamente.
Mi primer acercamiento:
/*Declaration*/
fpost_t stream_sdout;
/*code*/
if ( fgetpos( stdout, &stream_sdout) == -1 )
perror(Error:);
Dice búsqueda ilegal.
No tengo idea de por qué sucede esto.
Pero si logro que esto funcione, entonces solo necesito usar fsetpos(stdout, &stream_stdout)
y debería funcionar.
Mi segunda idea fue copiar la salida estándar usando dup2(stdout, 4)
a la tabla de descriptores de archivo, en la posición 4. Pero eso tampoco funciona.
¿Cómo puedo cambiar la salida estándar a su destino original (terminal, conducto, archivo, lo que sea)?
#include <unistd.h>
...
int saved_stdout;
...
/* Save current stdout for use later */
saved_stdout = dup(1);
dup2(my_temporary_stdout_fd, 1);
... do some work on your new stdout ...
/* Restore stdout */
dup2(saved_stdout, 1);
close(saved_stdout);

jonathan leffler
Antes de hacer el dup2(fd, STDOUT_FILENO)
debe guardar el descriptor de archivo abierto actual para la salida estándar haciendo int saved_stdout = dup(STDOUT_FILENO);
(alquilar dup()
elegir un número de descriptor de archivo disponible para usted). Luego, una vez que haya terminado con la salida redirigida a un archivo, puede hacer dup2(saved_stdout, STDOUT_FILENO)
para restaurar la salida estándar a donde estaba antes de que comenzara todo esto (y debe cerrar saved_stdout
también).
Debe preocuparse por vaciar los flujos de E/S estándar (fflush(stdout)
) en los momentos apropiados mientras juegas con esto. Eso significa ‘antes de cambiar stdout’.
Si el programa se ejecuta en un entorno Linux, puede freopen ("/dev/stdout", "a", stdout)
.
pero si sabes eso stdout
era la terminal, freopen ("/dev/tty", "a", stdout)
o el equivalente para otros sistemas operativos, incluso Windows.
Tengo la sensación de que tratando de moverme
stdout
alrededor de esta manera es probablemente una mala idea: ¿en qué posición exactamente debería estar el Terminal informe enfgetpos()
? ¿Por qué no simplemente abrir un archivo y enviarlo usandofwrite()
ofprintf()
owrite()
y la salida a la terminal a través de/dev/tty
¿Cuándo lo necesitas?– Sarnold
14/06/2012 a las 22:30
@sarnold: probablemente porque el programa tiene bibliotecas u otro código inalterable que está conectado a
stdout
.– Wallyk
14 de junio de 2012 a las 22:31
@sarnold, en realidad no pensé en esa posibilidad. Déjame comprobar rápidamente.
– Imperio Alessandro
14 de junio de 2012 a las 22:37
No tengo suficiente información para publicar una buena respuesta, así que estoy comentando en su lugar. En Windows, puede volver a conectar la consola. Miraría cualquier documentación del SDK de Win32. No es dificil; Simplemente no puedo recordar cómo hacerlo.
– pulpo agarrar
14 de junio de 2012 a las 22:49
@sarnold gracias por el consejo! Eso fue mucho más fácil. Pude hacerlo funcionar a la perfección. Aún tengo la duda de si es posible restaurar el std, pero tu solución me sacó de un apuro. ¡Gracias!
– Imperio Alessandro
14 de junio de 2012 a las 22:54