6

HTML 解析に libxml2 を使用して Linux 用のプログラムを作成しました。html パーサーはその役割を果たしますが、多くのさまざまなエラーを stderr に書き込みます。stderr をまったく無効にすることはできますか (または、リダイレクト シェル スクリプトで実行する必要がなく、/dev/null にリダイレクトできますか)? 自分のエラーを stdout に書き込まなければならないことに耐えることができます。これらのエラーを取り除きたいだけです。

4

5 に答える 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

次のように、コマンドラインからstderrを(とにかくbashで)リダイレクトできます。

./myProgram 2>/dev/null

于 2009-06-15T20:23:17.227 に答える
0

関数のマニュアルページを参照してくださいpipe(2)。STDERR とハンドルを /dev/null に渡すと、動作するはずです。

于 2009-06-15T20:22:02.503 に答える