Ich schrieb ein Programm für Linux mit libxml2 für HTML-Parsing. Obwohl es seine Aufgabe erfüllt, schreibt der HTML-Parser viele verschiedene Fehler in stderr. Ist es möglich, stderr überhaupt zu deaktivieren (oder um es auf/dev/null umzuleiten, während es nicht mit einem umleitenden Shell-Skript ausgeführt werden muss)? Ich kann damit leben, dass ich meine eigenen Fehler zu Standout schreiben muss, ich will nur diese Fehler loswerden.Ist es möglich, stderr in C++ zu deaktivieren?
Antwort
Verwenden freopen zu umleiten/null dev:
freopen("/dev/null", "w", stderr);
Siehe Handbuchseite für die Funktion pipe(2)
. Übergeben Sie es STDERR und ein Handle zu/dev/null, und es sollte funktionieren.
equiv: NUL auf Windows –
können Sie stderr umleiten (in bash, sowieso) von der Kommandozeile als solche:
./myProgram 2>/dev/null
Das ist, was er ausdrücklich nicht gebeten haben. –
Ich war nicht klar, was er mit einem "umleitenden Shell-Skript" meinte. – Ambuoroko
freopen()
Ing stderr
wurde bereits erwähnt, die Ihre spezifische Frage adressiert. Aber da Sie mit libxml2 arbeiten, möchten Sie vielleicht eine feinere Kontrolle über die Fehlermeldungen haben und nicht nur alle stderr-Nachrichten kategorisch umleiten. Die Fehlermeldungen sind aus einem bestimmten Grund da, weißt du. Siehe libxml2 documentation zur Verwendung von Fehlerhandlern mit libxml2. Ein guter Ausgangspunkt ist xmlSetGenericErrorFunc()
Danke ich werde es in der Zukunft verwenden, aber ich brauche jetzt eine schnelle Lösung, also wird Freopen jetzt tun. –
Freopen (3) ist eine C-orientierte Lösung (nicht C++ als die Frage gestellt), und es ist nur Glück, dass es funktioniert. Es ist nicht angegeben zu arbeiten. Es funktioniert nur, wenn der Dateideskriptor 2 geschlossen ist und/dev/null geöffnet ist, wird der Dateideskriptor 2 abgerufen. In einer Umgebung mit mehreren Threads kann dies fehlschlagen. Sie können auch nicht garantieren, dass die Implementierung von freopen (3) zuerst den gegebenen Stream schließt, bevor die neue Datei geöffnet wird. Dies alles geht davon aus, dass Sie nicht davon ausgehen können, dass libxml2 C-style stdio verwendet.
Ein POSIX-Lösung ist offen zu verwenden (2) und 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);
Beat mich um 10 Sekunden! –