3

デバッグ目的でSIGSEGVのシグナルハンドラーをインストールするライブラリがあります。SIGSEGVハンドラーは、いくつかの情報を出力してから、プログラムを終了します。

最近、Javaから(JNIを使​​用して)このライブラリを呼び出す必要がありました。私が遭遇した問題は、JVMが私よりも便利な目的でSIGSEGVのシグナルハンドラーもインストールすることです。

したがって、私が選択したいアクションは、ライブラリがシグナル用にすでにインストールされているシグナルハンドラーを見つけた場合、シグナルをインストールしないということです。

わかりやすくするために、私はsigactioncallを使用しています。

今、私の機能を達成するために私がしなければならないことは次のとおりです。

a。すべての信号をブロックします。

b。sigactionを呼び出し、oactが有効なハンドラーを返すかどうかを確認します。

c。もしそうなら、新しい行為としてoactでsigactionを呼び直してください。

d。UNBLOCK信号。

Bとcは私には面倒なようです。私が望んでいるのは、最初にハンドラーを置き換えてから元のハンドラーに再置き換えなくても、特定の信号に既にハンドラーがあるかどうかを判断できるようにすることです(何も達成されません)。

sigactionよりも細かいものはありますか?

4

1 に答える 1

2

を呼び出しsigaction(SIGSEGV, NULL, &sa)て、信号の配置を変更せずに問い合わせることができます。

シグナルの処理はプロセス内のすべてのスレッドに共通ですが、シグナルマスクはスレッドごとにあるため、シグナルをブロックしても他のスレッドは「ロックアウト」されないことに注意してください。

于 2012-08-09T10:15:40.437 に答える