7 シグナル・チェーン

シグナル・チェーンを使用すると、独自のシグナル・ハンドラをインストールする必要があるアプリケーションを記述できます。この機能は、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によってインストールされ、オペレーティング・システムで認識されているシグナル・ハンドラではなく、保存されたシグナル・ハンドラを返します。

注意:

SIGQUITSIGTERMSIGINTおよび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とは異なります。