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