Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

7.3 シグナル・チェーン

ネイティブ・コードを含むアプリケーションに独自のシグナル・ハンドラが必要な場合は、シグナル・チェーン機能とともにアプリケーションを使用しなければいけないことがあります。シグナル・チェーン機能は、次の機能を提供します。

  • 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に示すように致命的エラーで終了します。

同様に、SIGQUITSIGTERMSIGINT、およびSIGHUPシグナルもチェーンできません。アプリケーションでこれらのシグナルを処理する必要がある場合は、-Xrsオプションの使用を検討してください。

Oracle Solarisオペレーティング・システムでは、Java以外かつVM以外のスレッドでのみSIGUSR2シグナルをチェーンできます(つまり、VMに接続していないアプリケーションで作成されたネイティブ・スレッドでのみ使用できます)。

目次      

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.