2009-06-15 4 views
5

Я написал программу для linux, используя libxml2 для синтаксического анализа html. Хотя он выполняет свою работу, анализатор html записывает множество ошибок в stderr. Можно ли вообще отключить stderr (или перенаправить его на/dev/null, не выполняя его с помощью сценария перенаправления оболочки)? Я могу жить с необходимостью писать свои собственные ошибки в stdout, я просто хочу избавиться от этих ошибок.Можно ли отключить stderr в C++?

ответ

17

Используйте freopen для перенаправления устр/нуль:

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

Ударьте меня на 10 секунд! –

0

См. Страницу руководства для функции pipe(2). Передайте ему STDERR и дескриптор/dev/null, и он должен работать.

+0

эквив: NUL на окнах –

0

Вы можете перенаправить поток ошибок (в Баш, во всяком случае) из командной строки, как например:

./myProgram 2>/Dev/нуль

+4

Что, что он специально не просил. –

+0

Я не понял, что он подразумевал под «перенаправлением сценария оболочки». – Ambuoroko

14

freopen() ing stderr уже упоминалось, в котором рассматривается ваш конкретный вопрос. Но поскольку вы работаете с libxml2, вам может понадобиться более тонкий контроль над сообщениями об ошибках, а не просто перенаправление всех сообщений stderr категорически. Знаете, сообщения об ошибках есть по какой-то причине. См. libxml2 documentation о том, как использовать обработчики ошибок с помощью libxml2. Хорошей отправной точкой является xmlSetGenericErrorFunc()

+0

Спасибо, я буду использовать его в будущем, но сейчас мне нужно быстрое решение, так что freopen будет делать это сейчас. – 2009-06-15 20:49:03

5

freopen (3) - это C-ориентированное решение (а не C++ в качестве заданного вопроса), и это просто удача, что заставляет его работать. Не работает работа. Это работает только тогда, когда файл дескриптор 2 закрыт и/dev/null открывается, он получает файловый дескриптор 2. В многопоточной среде это может завершиться неудачей. Вы также не можете гарантировать, что реализация freopen (3) сначала закрывает данный поток перед открытием нового файла. Это все предполагается, что вы не можете предположить, что libxml2 использует stdio C-style.

раствор А POSIX для этого является использование открытого (2) и 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); 
Смежные вопросы