是否可以在C++中禁用stderr?

5 c++ linux libxml2 stderr

我使用libxml2编写了一个用于html解析的linux程序.虽然它可以完成它的工作,但是html解析器会向stderr写入许多不同的错误.是否可以根本禁用stderr(或者将其重定向到/ dev/null,而不必使用重定向shell脚本运行它)?我可以忍受将自己的错误写入stdout,我只是想摆脱这些错误.

Rob*_*ves 18

使用freopen重定向到dev/null:

freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)


laa*_*lto 14

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


cam*_*amh 6

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);
Run Code Online (Sandbox Code Playgroud)