我使用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)
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)