2016-10-25 2 views
0

私はWindows上でホットスポットJVMでSIGBREAKを処理する(hereを文書化など)sun.miscパッケージに信号処理クラスを使用しようとしているので、私はCtrlキーにシャットダウンをトリガすることができます上のホットスポットのJVMでSIGBREAKを処理しようとしたときスレッドをダンプするのではなく、ブレークします。しかし、私はハンドラを設定しようとするとSIGBREAKが既にOSやVMによって処理されていると言うIllegalArgumentExceptionがスローされてしまいます。これは、おそらくSIGBREAKシグナルの処理を無効にする-Xrsフラグを付けてJVMを実行しても発生します。はIllegalArgumentException Windowsの

誰もWindows上でsun.misc.Signalを使用して信号を処理する経験がありますか?これを回避する方法はありますか?

答えて

0

これは非常に混乱するトピックのようです。

documentation of the java launcherを指定:

-Xrsオプションを使用すると、JVMは、それがために見たりプロセスCTRL_C_EVENTCTRL_CLOSE_EVENTCTRL_LOGOFF_EVENT、またはCTRL_SHUTDOWN_EVENTていないことを意味し、コンソールコントロールハンドラをインストールしません。

CTRL_BREAK_EVENTはリストに含まれていません。したがって、このオプションの影響を実際に受けませんが、ドキュメントでは-Xrsを指定すると、この機能にまったく影響を受けない場合、「Ctrl + Breakスレッドダンプは利用できません。」となります。

さらに、この意味合いは、読者が期待するものとはまったく反対です。 JVMが-Xrsオプションのためにこれらのイベントをリッスンしない場合、JVMはそれらをJavaサイドハンドラに転送することはできません。つまり、ではなく、がサポートされています。これは、そのオプションの影響を受けるシグナルのシグナルハンドラをインストールしようとすると簡単にテストできます。-Xrsでない場合にのみが指定されている場合にのみ動作します。 the code that tries to install a signal handlerを調べて

long oldH = handle0(sig.number, newH); 
if (oldH == -1) { 
    throw new IllegalArgumentException 
     ("Signal already used by VM or OS: " + sig); 
} 

私たちは、障害のすべての種類の一般的な答えは-1であることがわかり、私たちはあまりにも文字通りない「信号がすでにVMやOSによって使用される」例外メッセージを取る必要があります。この場所では、「ハンドブックをインストールできませんでした。なぜなら、JVMは-Xrsオプションのためにそのような種類のハンドラをインストールしないためです」というさまざまな理由を報告する余地はありません。

限り私は理解されるように、-Xrsオプションは、JVMは、Java側sun.misc.Signal処理するための信号を利用可能にしないように、干渉することなく、低レベルの信号のためのハンドラをインストールするネイティブコードを可能にするようになっています。

SIGTERMの問題に関しては、ドキュメント全体が現実と同期していないようです。私のテスト時点で、-Xrsを指定した最後のJVMは、CTRL + BREAKスレッドダンプは利用できませんでした。Java 6でした。しかし、上で説明したように、シグナルがネイティブコードで利用可能であり、そのようなハンドラが存在しない場合にはアボートを引き起こし、sun.misc.Signalに利用可能にすることはできません。そのJVMの下でも、-Xrsオプションが存在するかどうかにかかわらず、SIGBREAKSignalHandlerをインストールすることは不可能でした。

関連する問題