Можно ли отключить stderr в C ++? - PullRequest
5 голосов
/ 16 июня 2009

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

Ответы [ 5 ]

18 голосов
/ 16 июня 2009

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

freopen("/dev/null", "w", stderr);
14 голосов
/ 16 июня 2009

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

6 голосов
/ 16 июня 2009

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

Решением POSIX для этого является использование open (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);
0 голосов
/ 16 июня 2009

Вы можете перенаправить stderr (в любом случае, в bash) из командной строки следующим образом:

. / MyProgram 2> / dev / null

0 голосов
/ 16 июня 2009

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

...