C++ を使用して C ライブラリ関数をラップしようとしています。この関数は、デバイスの初期化を試みます。エラーが発生すると、プログラムの実行を強制的に終了させます (おそらく でexit(1)
)。代わりにエラー時に例外をスローしたいと思います。Cソースを編集せずにこれを行う方法はありますか?
呼び出された関数がプログラムを終了できないようにすることはできますか?
ハンドラーをインストールatexit
し、ハンドラーから例外をスローします。うーん。
PS。したがって、人々が指摘したように、C++ 例外は機能しないため、C の「例外」を使用します。
#include <cstdlib>
#include <iostream>
#include <csetjmp>
jmp_buf buf;
void foo ()
{
longjmp (buf, 1);
}
void bar () { exit(-1); }
int
main ()
{
atexit (foo);
if (setjmp (buf))
{
bar ();
}
else
{
std::cout << "graceful" << std::endl;
}
return 0;
}
Unix / Linuxを使用してstrace
いる場合は、ライブラリが正確に何を呼び出しているかを確認してから、を使用して呼び出された関数をオーバーライドできますLD_PRELOAD
。
非常に優れたソリューションではありませんが、機能するはずです。新しいプロセスをフォークし、子プロセスでその C 関数を呼び出します。親プロセスでは、子が終了するのを待ち、エラー コードを確認し、exit(1)
呼び出されたことを意味する 1 の場合は、例外をスローします。