Ho scritto un programma per linux usando libxml2 per l'analisi html. Sebbene faccia il suo lavoro, il parser html scrive molti errori diversi su stderr. È possibile disabilitare lo stderr (o ridirigerlo a/dev/null senza doverlo eseguire con uno script di reindirizzamento della shell)? Posso vivere con dover scrivere i miei errori per lo stdout, voglio solo sbarazzarmi di questi errori.È possibile disattivare lo stderr in C++?
risposta
Usa nullo freopen reindirizzare a dev /:
freopen("/dev/null", "w", stderr);
Vedere la pagina di manuale per la funzione pipe(2)
. Passalo STDERR e un handle a/dev/null, e dovrebbe funzionare.
equiv: NUL sulle finestre –
È possibile reindirizzare stderr (in bash, comunque) dalla linea di comando in quanto tale:
./myProgram 2>/dev/null
Che è quello che specificamente non ha chiesto. –
Non ero chiaro su cosa intendesse con un "redirect shell script". – Ambuoroko
freopen()
ing stderr
è già stato menzionato, che affronta la tua domanda specifica. Ma dal momento che stai lavorando con libxml2, potresti volere un controllo più dettagliato dei messaggi di errore e non solo reindirizzare categoricamente tutti i messaggi di stderr. I messaggi di errore sono lì per un motivo, lo sai. Vedi libxml2 documentation su come utilizzare i gestori di errori con libxml2. Un buon punto di partenza è xmlSetGenericErrorFunc()
Grazie, lo userò in futuro, ma ho bisogno di una soluzione rapida al momento, quindi per il momento freopen lo farò. –
freopen (3) è una soluzione C-oriented (non C++ come la domanda richiesta), ed è solo fortuna che lo fa funzionare. Non è specificato per funzionare. Funziona solo perché quando il descrittore di file 2 è chiuso e/dev/null viene aperto, ottiene il descrittore di file 2. In un ambiente multi-thread, questo potrebbe fallire. Inoltre, non è possibile garantire che l'implementazione di freopen (3) prima chiuda lo stream specificato prima di aprire il nuovo file. Tutto ciò presuppone che non si possa assumere che libxml2 usi stdio in stile C.
soluzione A POSIX per questo è di usare open (2) e 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);
Sconfiggilo di 10 secondi! –