Dentro de mi programa C, me gustaría redirigir temporalmente STDOUT a "/ dev/null" (por ejemplo). Luego después de escribir en "/ dev/null" Me gustaría restaurar STDOUT. ¿Cómo manejo esto?¿Cómo podría redireccionar temporalmente stdout a un archivo en un programa C?
23
A
Respuesta
47
En sistemas POSIX, puede hacerlo de la siguiente manera:
int bak, new;
fflush(stdout);
bak = dup(1);
new = open("/dev/null", O_WRONLY);
dup2(new, 1);
close(new);
/* your code here ... */
fflush(stdout);
dup2(bak, 1);
close(bak);
Lo que queremos no es posible en mayor generalidad.
Cualquier solución que use freopen
es incorrecta, ya que no le permite restaurar el original stdout
. Cualquier solución por asignación a stdout
es incorrecta, ya que stdout
no es un lvalue (es una macro que se expande a una expresión de tipo FILE *
).
Cuestiones relacionadas
- 1. ¿Cómo puedo redireccionar stdout a un archivo en tcl
- 2. redireccionar stdout a logcat en Android NDK
- 3. Cómo redireccionar stdout, stderr a/dev/tty
- 4. redireccionar stdout desde SBT ejecutar al archivo
- 5. UnicodeEncodeError al redireccionar stdout
- 6. ¿Cómo veo un STDOUT de un programa en ejecución de un programa perl que lo llamó?
- 7. Problema al redireccionar una salida del programa C en bash
- 8. redireccionar stdout al registrador en Python
- 9. ¿Cómo escribir en StdOut Stream de un programa directamente en C#?
- 10. ¿Cómo puedo redireccionar la salida de la tarea ant exec tanto a un archivo como a stdout?
- 11. ¿cómo escribo en stdout desde un programa MFC?
- 12. Multiprocesamiento Python: ¿Cómo puedo redireccionar FIABLY stdout de un proceso hijo?
- 13. ¿Por qué mi programa simple C muestra basura a stdout?
- 14. Analizando un stdout en Python
- 15. C++ Indicador FILE a stdout?
- 16. Cómo redirigir stdout y stderr a un archivo
- 17. ¿Cómo puedo redireccionar stdout a alguna pantalla visible en una aplicación de Windows?
- 18. Cómo depurar un programa C
- 19. leyendo un archivo XML en un programa C++
- 20. Cómo ocultar temporalmente stdout o stderr mientras se ejecuta una prueba de unidad en Python
- 21. Incrustar un archivo ejecutable externo dentro de un programa C#
- 22. redireccionar std :: cout a un escritor personalizado
- 23. stdout y stderr redirección a un único archivo con prefijos
- 24. ¿Cómo señalo un manejador de archivo a STDOUT (u otro manejador de archivo) en Perl?
- 25. Ejecutar programa desde dentro de un programa C
- 26. Escribir TODO el resultado del programa en un archivo txt en C++
- 27. ¿Cómo desactivar un complemento en Vim temporalmente?
- 28. Android - Exportar un programa a un archivo apk
- 29. ¿Cómo ejecutar un programa Java desde C#?
- 30. ¿Cómo ejecutar un programa C en Ubuntu?
No utilice dup2. Use close (nuevo) y luego dup (1); dup() asegura que obtendrá el descriptor correcto. 'Si newfd estaba abierto, se perderán los errores que se habrían informado al cerrar() tiempo. Un programador cuidadoso no usará dup2 sin cerrar primero newfd. ' –
@MoraruLilian: utilicé' dup2' muy intencionalmente. Tu comentario tiene todos los argumentos contra mi código, por lo que no estoy seguro de cuál es tu punto, pero cualquier solución sin 'dup2' tiene ** condiciones peligrosas de carrera **. El punto de 'dup2 (x, y)' es reemplazar 'y' ** atómicamente ** con una copia de' x'. –