¿Cómo podría redirigir temporalmente stdout a un archivo en un programa C?

1 minuto de lectura

avatar de usuario
Franco

Dentro de mi programa C, me gustaría redirigir temporalmente stdout a /dev/null (por ejemplo). Entonces, después de escribir a /dev/null, me gustaría restaurar stdout. ¿Cómo manejo esto?

avatar de usuario
R.. GitHub DEJAR DE AYUDAR A ICE

En los 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 quieres no es posible en mayor generalidad.

Cualquier solución usando freopen es incorrecto, ya que no permite restaurar el original stdout. Cualquier solución por encargo a stdout está mal, como stdout no es un lvalue (es una macro que se expande a una expresión de tipo FILE *).

  • No use dup2. Use cerrar (nuevo) y luego dup (1); dup() asegura que obtendrá el descriptor correcto. If newfd was open, any errors that would have been reported at close() time, are lost. A careful programmer will not use dup2 without closing newfd first.

    – Lilian A. Moraru

    11/03/2012 a las 21:30


  • @MoraruLilian: Usé dup2 muy intencionalmente. Su comentario tiene todos los argumentos mezclados con mi código, por lo que no puedo estar seguro de cuál es su punto, pero cualquier solución sin dup2 posee condiciones de carrera peligrosas. El punto de dup2(x,y) es reemplazar y atómicamente con una copia de x.

    – R.. GitHub DEJA DE AYUDAR A ICE

    12 de marzo de 2012 a las 3:04

  • Si está buscando una forma de escribir en un nuevo archivo y es como yo y no ha memorizado todos los argumentos para opencambiar el open línea a newFd = open(filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );

    –Mark Lakata

    3 de junio de 2020 a las 1:52


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad