8 シグナル・チェーン
シグナル・チェーンを使用すると、独自のシグナル・ハンドラをインストールする必要があるアプリケーションを記述できます。この機能は、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によってすでにインストールされたシグナル・ハンドラと競合する場合に、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
-
この間に呼び出される
sigaction()
は、HotSpot VMによってインストールされ、オペレーティング・システムで認識されているシグナル・ハンドラではなく、保存されたシグナル・ハンドラを返します。 -
ノート:
SIGQUIT
、SIGTERM
、SIGINT
およびSIGHUP
シグナルはチェーンできません。アプリケーションでこれらのシグナルを処理する必要がある場合は、—Xrs
オプションの使用を検討してください。
macOSでのシグナル・チェーンの有効化
macOSでシグナル・チェーンを有効にするには、次の環境変数を設定します。
-
DYLD_INSERT_LIBRARIES
: 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
となり、Linuxのlibjsig.so
とは異なります。