Java

シグナル連鎖機能

 

JavaTM 2 SDK, Standard Edition, (J2SDK) v1.4 には、新しいシグナル連鎖機能が含まれています。 シグナル連鎖機能を使用すると、Java プラットフォームと、独自のシグナルハンドラをインストールするネイティブコードとの相互運用性が向上します。 シグナル連鎖機能は Solaris プラットフォームと Linux プラットフォームの両方で動作します。

シグナル連鎖機能は、以前のバージョンの Java HotSpot VM で発生したシグナル処理上の問題を解決するために導入されました。 バージョン 1.4 より前の Java HotSpot VM では、SIGBUSSIGSEGVSIGILL などのシグナルを処理するためにアプリケーションでインストールしたシグナルハンドラは使用できませんでした。なぜなら、このようなシグナルハンドラは、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 の作成や埋め込みを行うアプリケーションにこのライブラリをリンクします。次にその例を示します。

cc -L <libjvm.so dir> -ljsig -ljvm java_application.c
または、LD_PRELOAD 環境変数を使用する方法もあります。次にその例を示します。
export LD_PRELOAD=<libjvm.so dir>/libjsig.so; java_application (ksh)

setenv LD_PRELOAD <libjvm.so dir>/libjsig.so; java_application (csh)
この間に呼び出される signal()/sigset()/sigaction() は、保存されたシグナルハンドラを返します。Java HotSpot VM でインストールされた、OS で認識されているシグナルハンドラではありません。

シグナル連鎖機能は、機能拡張要求 4381843 に対応するために導入されました。


Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved.

Sun