2009-06-15 26 views
5

Escribí un programa para Linux usando libxml2 para el análisis html. Aunque hace su trabajo, el analizador html escribe muchos errores diferentes en stderr. ¿Es posible deshabilitar stderr en absoluto (o redirigirlo a/dev/null sin tener que ejecutarlo con un script de shell de redireccionamiento)? Puedo vivir teniendo que escribir mis propios errores en stdout, solo quiero deshacerme de estos errores.¿Es posible deshabilitar stderr en C++?

Respuesta

17

Uso nula freopen para redirigir a dev /:

freopen("/dev/null", "w", stderr); 
+0

¡Derrotame por 10 segundos! –

0

Consulte la página del manual para la función pipe(2). Pase STDERR y un controlador a/dev/null, y debería funcionar.

+0

equiv: NUL en las ventanas –

0

Puede redirigir stderr (en bash, de todos modos) desde la línea de comandos, tales como:

./myProgram 2>/dev/null

+4

¿Qué es lo que específicamente no pidió. –

+0

No tenía claro qué quería decir con un "guión de shell redirigido". – Ambuoroko

14

freopen() ing stderr ya se ha mencionado, que responde a su pregunta específica. Pero dado que está trabajando con libxml2, es posible que desee un control más detallado de los mensajes de error y no solo redirigir categóricamente todos los mensajes de stderr. Los mensajes de error están ahí por una razón, ya sabes. Consulte libxml2 documentation sobre cómo usar los manejadores de errores con libxml2. Un buen punto de partida es xmlSetGenericErrorFunc()

+0

Gracias lo usaré en el futuro, pero necesito una solución rápida en este momento, así que freopen lo hará por ahora. –

5

freopen (3) es una solución orientada a C (no C++ como la pregunta), y es solo la suerte lo que hace que funcione. No está especificado para funcionar. Solo funciona porque cuando el descriptor de archivo 2 se cierra y se abre/dev/null, obtiene el descriptor de archivo 2. En un entorno de subprocesos múltiples, puede fallar. Tampoco puede garantizar que la implementación de freopen (3) primero cierre la transmisión dada antes de abrir el nuevo archivo. Todo esto supone que no se puede suponer que libxml2 usa st-di de estilo C.

solución A POSIX a esto es utilizar abierto (2) y dup2 (2):

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

... 

/* error checking elided for brevity */ 
int fd = ::open("/dev/null", O_WRONLY); 
::dup2(fd, 2); 
::close(fd); 
Cuestiones relacionadas