2011-01-28 11 views

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 *).

+0

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. ' –

+9

@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'. –

Cuestiones relacionadas