是否可以在 C++ 中禁用 stderr?
我使用 libxml2 为 html 解析编写了一个 Linux 程序。 尽管 html 解析器完成了它的工作,但它还是将许多不同的错误写入 stderr。 是否可以完全禁用 stderr(或将其重定向到 /dev/null 而不必使用重定向 shell 脚本运行它)? 我可以忍受必须将自己的错误写入标准输出,我只是想摆脱这些错误。
I wrote a program for linux using libxml2 for html parsing. Although it does its job, the html parser writes lots of various errors to stderr. Is it possible to disable stderr at all (or redirect it to /dev/null while not having to run it with a redirecting shell script)? I can live with having to write my own errors to stdout, I just want to get rid of these errors.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
使用 freopen 重定向到 dev/null:
Use freopen to redirect to dev/null:
已经提到了
freopen()
ingstderr
,它解决了您的具体问题。 但由于您使用的是 libxml2,因此您可能需要对错误消息进行更细粒度的控制,而不仅仅是明确地重定向所有 stderr 消息。 您知道,错误消息的出现是有原因的。 有关如何在 libxml2 中使用错误处理程序的信息,请参阅 libxml2 文档。 一个好的起点是xmlSetGenericErrorFunc()
freopen()
ingstderr
has already been mentioned, which addresses your specific question. But since you're working with libxml2, you may want finer grained control of the error messages and not just redirect all stderr messages categorically. The error messages are there for a reason, you know. See libxml2 documentation on how to use error handlers with libxml2. A good starting point isxmlSetGenericErrorFunc()
freopen(3) 是一个面向 C 的解决方案(不是问题所要求的 C++),它的工作只是运气。 没有指定它可以工作。 它之所以有效,是因为当文件描述符 2 关闭并打开 /dev/null 时,它会获取文件描述符 2。在多线程环境中,这可能会失败。 您也不能保证 freopen(3) 的实现在打开新文件之前首先关闭给定的流。 这一切都假设您不能假设 libxml2 使用 C 风格的 stdio。
POSIX 解决方案是使用 open(2) 和 dup2(2):
freopen(3) is a C-oriented solution (not C++ as the question asked for), and it is just luck that makes it work. It is not specified to work. It only works because when file descriptor 2 is closed and /dev/null is opened, it gets file descriptor 2. In a multi-threaded environment, this may fail. You also cannot guarantee that the implementation of freopen(3) first closes the given stream before opening the new file. This is all assuming that you cannot assume that libxml2 uses C-style stdio.
A POSIX solution to this is to use open(2) and dup2(2):
请参阅
pipe(2)
函数的手册页。 将它传递给 STDERR 和 /dev/null 的句柄,它应该可以工作。See the manual page for the
pipe(2)
function. Pass it STDERR and a handle to /dev/null, and it should work.您可以从命令行重定向 stderr (无论如何,在 bash 中),如下所示:
./myProgram 2>/dev/null
You can redirect stderr (in bash, anyhow) from the command line as such:
./myProgram 2>/dev/null