HTML 解析に libxml2 を使用して Linux 用のプログラムを作成しました。html パーサーはその役割を果たしますが、多くのさまざまなエラーを stderr に書き込みます。stderr をまったく無効にすることはできますか (または、リダイレクト シェル スクリプトで実行する必要がなく、/dev/null にリダイレクトできますか)? 自分のエラーを stdout に書き込まなければならないことに耐えることができます。これらのエラーを取り除きたいだけです。
5 に答える
freopen を使用して dev/null にリダイレクトします。
freopen("/dev/null", "w", stderr);
freopen()
ingstderr
はすでに言及されており、特定の質問に対処しています。しかし、libxml2 を使用しているため、すべての stderr メッセージを分類的にリダイレクトするだけでなく、エラー メッセージをより細かく制御したい場合があります。エラーメッセージには理由があります。libxml2でエラー ハンドラを使用する方法については、 libxml2 のドキュメントを参照してください。良い出発点はxmlSetGenericErrorFunc()
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);
次のように、コマンドラインからstderrを(とにかくbashで)リダイレクトできます。
./myProgram 2>/dev/null
関数のマニュアルページを参照してくださいpipe(2)
。STDERR とハンドルを /dev/null に渡すと、動作するはずです。