6

我为 linux 编写了一个程序,使用 libxml2 进行 html 解析。尽管它完成了它的工作,但 html 解析器向 stderr 写入了许多不同的错误。是否可以完全禁用 stderr(或将其重定向到 /dev/null 而不必使用重定向 shell 脚本运行它)?我可以忍受将自己的错误写入标准输出,我只想摆脱这些错误。

4

5 回答 5

20

使用 freopen 重定向到 dev/null:

freopen("/dev/null", "w", stderr);
于 2009-06-15T20:24:31.657 回答
14

freopen()ingstderr已经提到过,它解决了您的具体问题。但由于您使用的是 libxml2,您可能希望对错误消息进行更细粒度的控制,而不仅仅是明确地重定向所有 stderr 消息。您知道,出现错误消息是有原因的。请参阅libxml2 文档,了解如何将错误处理程序与 libxml2 一起使用。一个好的起点是xmlSetGenericErrorFunc()

于 2009-06-15T20:31:21.640 回答
8

freopen(3) 是一个面向 C 的解决方案(不是问题所要求的 C++),只是运气使它工作。它没有指定工作。它之所以有效,是因为当关闭文件描述符 2 并打开 /dev/null 时,它会获取文件描述符 2。在多线程环境中,这可能会失败。您也不能保证 freopen(3) 的实现在打开新文件之前首先关闭给定的流。这一切都假设您不能假设 libxml2 使用 C 风格的 stdio。

对此的 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);
于 2009-06-16T02:00:03.377 回答
0

有关该功能,请参见手册页pipe(2)。将 STDERR 和 /dev/null 的句柄传递给它,它应该可以工作。

于 2009-06-15T20:22:02.503 回答
0

您可以从命令行重定向 stderr(无论如何在 bash 中),如下所示:

./myProgram 2>/dev/null

于 2009-06-15T20:23:17.227 回答