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?
¿Cómo podría redirigir temporalmente stdout a un archivo en un programa C?
Franco
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 sindup2
posee condiciones de carrera peligrosas. El punto dedup2(x,y)
es reemplazary
atómicamente con una copia dex
.– 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
open
cambiar elopen
línea anewFd = open(filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );
–Mark Lakata
3 de junio de 2020 a las 1:52