ネイティブ・コードを含むアプリケーションに独自のシグナル・ハンドラが必要な場合は、シグナル・チェーン機能とともにアプリケーションを使用しなければいけないことがあります。シグナル・チェーン機能は、次の機能を提供します。
HotSpot VMの作成時に事前インストールされるシグナル・ハンドラに対するサポート。
VMが最初に作成されるときに、既存のシグナル・ハンドラ(つまり、VMで使用されるシグナルのハンドラ)が保存されます。実行中にこれらのシグナルが生成され、その対象がJava HotSpot VMでない場合は、事前インストールされたハンドラが呼び出されます。つまり、これらのシグナルのために、事前インストールされたハンドラはVMハンドラの背後でチェーンされます。
HotSpot VM作成後にJNIコード内部または別のネイティブ・スレッドからインストールされるシグナル・ハンドラに対するサポート。
アプリケーションは、libc/libthread/libpthreadの前にlibjsig.so共有ライブラリをリンクしてロードできます。このライブラリは、Java HotSpot VMのシグナル・ハンドラがそのVMによってすでにインストールされたものと競合する場合に、signal()
、sigset()
、sigaction()
などの呼出しを遮断して、それらのハンドラが実際に置き換えられないようにします。かわりに、これらの呼出しは、新しいシグナル・ハンドラを保存します(つまり、VMがインストールしたハンドラの背後にそれらをチェーンします)。実行中にこれらのシグナルが生成され、その対象がJava HotSpot VMでない場合は、事前インストールされたハンドラが呼び出されます。
VMの作成後にインストールされるシグナル・ハンドラに対するサポートが必要ない場合、libjsig.so共有ライブラリは不要です。
libjsig.so共有ライブラリを使用するには、これら2つの手順のいずれかを実行します。
HotSpot VMを作成するか、埋め込むアプリケーションでそれにリンクします。
cc -L libjvm.so-directory -ljsig -ljvm java_application.c
LD_PRELOAD
環境変数を使用します。
KornShell (ksh):
export LD_PRELOAD=libjvm.so-directory/libjsig.so; java_application(ksh)
C shell (csh):
setenv LD_PRELOAD libjvm.so-directory/libjsig.so; java_application(csh)
この間に呼び出されるsignal()
、sigset()
、およびsigaction()
は、Java HotSpot VMによってインストールされ、オペレーティング・システムで認識されているシグナル・ハンドラではなく、保存されたシグナル・ハンドラを返します。
注意: SIGUSR1
は、チェーンできません。Oracle Solarisオペレーティング・システム上でアプリケーションがこのシグナルをチェーンしようとすると、HotSpot VMは例7-3に示すように致命的エラーで終了します。
同様に、SIGQUIT
、SIGTERM
、SIGINT
、およびSIGHUP
シグナルもチェーンできません。アプリケーションでこれらのシグナルを処理する必要がある場合は、-Xrs
オプションの使用を検討してください。
Oracle Solarisオペレーティング・システムでは、Java以外かつVM以外のスレッドでのみSIGUSR2
シグナルをチェーンできます(つまり、VMに接続していないアプリケーションで作成されたネイティブ・スレッドでのみ使用できます)。