シグナル・チェーンを使用すると、独自のシグナル・ハンドラをインストールする必要があるアプリケーションを記述できます。この機能は、Solaris、LinuxおよびmacOSで使用できます。
シグナル・チェーン機能には、次の機能があります。
OracleのHotSpot仮想マシンの作成時に事前インストールされるシグナル・ハンドラに対するサポート。
HotSpot VMが作成されるときに、HotSpot VMで使用されるシグナルのシグナル・ハンドラが保存されます。実行中にこれらのシグナルが生成され、その対象がHotSpot VMでない場合は、事前インストールされたハンドラが呼び出されます。つまり、これらのシグナルのために、事前インストールされたシグナル・ハンドラはHotSpot VMハンドラの背後でチェーンされます。
HotSpot VM作成後にJava Native Interfaceコード内部または別のネイティブ・スレッドからインストールされるシグナル・ハンドラに対するサポート。
アプリケーションは、libc/libthread/libpthread
ライブラリの前にlibjsig.so
共有ライブラリをリンクしてロードできます。このライブラリは、HotSpot VMで使用されるシグナル・ハンドラがそのVMによってすでにインストールされたシグナル・ハンドラと競合する場合に、signal()
、sigset()
、sigaction()
などの呼出しを遮断して、それらのシグナル・ハンドラが実際に置き換えられないようにします。かわりに、これらの呼出しは新しいシグナル・ハンドラを保存します。これらのシグナルのために、新しいシグナル・ハンドラはHotSpot VMシグナル・ハンドラの背後でチェーンされます。実行中にこれらのシグナルが生成され、その対象がHotSpot VMでない場合は、事前インストールされたハンドラが呼び出されます。
VMの作成後にインストールされるシグナル・ハンドラに対するサポートが必要ない場合、libjsig.so
共有ライブラリは不要です。
シグナル・チェーンを有効にするには、次の手順のいずれかを実行して、libjsig.so
共有ライブラリを使用します。
HotSpot VMを作成するか埋め込むアプリケーションにlibjsig.so
共有ライブラリをリンクさせます。
cc -L libjvm.so-directory -ljsig -ljvm java_application.c
LD_PRELOAD
環境変数を使用します。
Kornシェル(ksh)の場合:
export LD_PRELOAD=libjvm.so-directory/libjsig.so; java_application
Cシェル(csh)の場合:
setenv LD_PRELOAD libjvm.so-directory/libjsig.so; java_application
この間に呼び出されるsignal()
、sigset()
およびsigaction()
は、HotSpot VMによってインストールされ、オペレーティング・システムで認識されているシグナル・ハンドラではなく、保存されたシグナル・ハンドラを返します。
注意:
SIGQUIT
、SIGTERM
、SIGINT
およびSIGHUP
シグナルはチェーンできません。アプリケーションでこれらのシグナルを処理する必要がある場合は、—Xrs
オプションの使用を検討してください。
macOSでのシグナル・チェーンの有効化
macOSでシグナル・チェーンを有効にするには、次の環境変数を設定します。
DYLD_INSERT_LIBRARIES
: SolarisおよびLinuxで、LD_PRELOAD
環境変数のかわりに指定されたライブラリを事前ロードします。
DYLD_FORCE_FLAT_NAMESPACE
: macOSの2レベルの名前空間(シンボルの完全修飾名にそのライブラリが含まれる)のために、libjsig
ライブラリの関数を有効にし、OSの実装を置き換えます。この機能を有効にするには、この環境変数を任意の値に設定します。
次のコマンドを使用して、libjsig
ライブラリを事前ロードし、シグナル・チェーンを有効にします。
$ DYLD_FORCE_FLAT_NAMESPACE=0 DYLD_INSERT_LIBRARIES="JAVA_HOME/lib/libjsig.dylib" java MySpiffyJavaApp
注意:
macOSのライブラリ・ファイル名はlibjsig.dylib
となり、SolarisまたはLinuxのlibjsig.so
とは異なります。