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

时间:2009-06-15 20:18:18

标签: c++ linux libxml2 stderr

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

5 个答案:

答案 0 :(得分:18)

使用freopen重定向到dev / null:

freopen("/dev/null", "w", stderr);

答案 1 :(得分:14)

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

答案 2 :(得分: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);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

./ myProgram 2&gt; / dev / null