シグナル連鎖機能 |
シグナル連鎖機能は、以前のバージョンの Java HotSpot VM で発生したシグナル処理上の問題を解決するために導入されました。 バージョン 1.4 より前の Java HotSpot VM では、SIGBUS、SIGSEGV、SIGILL などのシグナルを処理するためにアプリケーションでインストールしたシグナルハンドラは使用できませんでした。なぜなら、このようなシグナルハンドラは、Java HotSpot VM で内部的に使用するシグナルハンドラと衝突する可能性があったからです。
シグナル連鎖機能は、次のサポートを提供します。
A. HotSpot VM の作成時に既にインストールされていたシグナルハンドラに対するサポート
B. HotSpot VM の作成後に JNI コード内部や別のネイティブスレッドからインストールされるシグナルハンドラに対するサポート
VM が最初に作成されるとき、VM で使用するシグナルに関連する既存のシグナルハンドラを保存します。これによって、先にインストールされていたシグナルハンドラ (A) をサポートします。 あとでこれらのシグナルが生成されたとき、その対象が Java HotSpot VM でない場合は、先にインストールされていたハンドラが起動されます。 つまり、これらのシグナルの処理について、先にインストールされていたハンドラは VM ハンドラの後ろに「連鎖」しています。
シグナル連鎖機能によって、アプリケーションでは、libc/libthread/libpthread の前に共有ライブラリ libjsig.so をリンクしたりロードしたりすることもできます。 このライブラリは、Java HotSpot VM (B) でインストール済みのハンドラと衝突する場合には signal()、sigset()、sigaction() などの呼び出しを遮断して、Java HotSpot VM のシグナルハンドラの置き換えを防ぎます。 代わりに、これらの呼び出しでは、新しいシグナルハンドラは保存され、VM でインストール済みのハンドラの後ろにつながれます。 その後、これらのシグナルが生成されたとき、その対象が Java HotSpot VM でない場合は、先にインストールされていたハンドラが起動されます。 (B) が必要ない場合、libjsig.so は不要です。
libjsig.so を使用するには、HotSpot VM の作成や埋め込みを行うアプリケーションにこのライブラリをリンクします。次にその例を示します。
または、LD_PRELOAD 環境変数を使用する方法もあります。次にその例を示します。cc -L <libjvm.so dir> -ljsig -ljvm java_application.c
この間に呼び出される signal()/sigset()/sigaction() は、保存されたシグナルハンドラを返します。Java HotSpot VM でインストールされた、OS で認識されているシグナルハンドラではありません。export LD_PRELOAD=<libjvm.so dir>/libjsig.so; java_application (ksh) setenv LD_PRELOAD <libjvm.so dir>/libjsig.so; java_application (csh)
シグナル連鎖機能は、機能拡張要求 4381843 に対応するために導入されました。
Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved. |