Java
Linux

Javaでシグナルを検知して処理する。

More than 1 year has passed since last update.


結論

しない方が良い。


そもそも「シグナル」とは


シグナル(英: signal)とは、UNIXやUnix系などのPOSIX準拠OSにおける限定的なプロセス間通信の一形態。

プロセス間あるいはスレッド間で非同期イベントの発生を伝える機構である。


例えば、プログラム実行中にCtrl+Cで停止できるが、

この時、OSに対してSIGINTが送信されており、killコマンドが発行され、停止している。


Javaでシグナルを検知するには

sun.misc.{Signal,SignalHandler} というAPIのがあります。

ですがこのAPIは非サポートで、Java9で残るのか無くなるのかも定かではないです。

https://blogs.oracle.com/java/get-ready-jdk9

怖い。

とても怖い。

とりあえず、今回のまとめではこれを使っていきます。


まず始めに、どのシグナルは使わないべきか調べよう。

VMが掴んだりしてるシグナルがあるので、そういうのは避けたいですね。

という事で。


JVMが使用しているシグナル

http://www.ibm.com/support/knowledgecenter/ja/SSYKE2_7.0.0/com.ibm.java.zos.71.doc/user/sighand.html

ここに書かれてるように、主要なシグナルは結構使われてます。


HotSpotVMが使用しているシグナル

http://www.oracle.com/technetwork/java/javase/signals-139944.html

これもまた、主要なシグナルは結構使われてます。( JVMと同じような感じだけど )


ここまでで分かる事


  • 主要のシグナルは検知しない方が無難(SIGINTとかSIGTERMとか)

  • ユーザ定義(SIGUSR1/SIGUSR2)も使われてる


だったら SIGRTMIN以降 を使おう!!!

というわけにもいかない。( ばっさり )

http://d.hatena.ne.jp/Kazuhira/20150422/1429713440

ここに書かれてるように、RTMIN以降は使えない。

悲しい。

とても悲しい。


という事で

ここまでで丸一日費やして、結局別の方法を取る事にしました。

幸い、「シグナルを検知する」という要件ではなかったので、別の方法で何とかなりそうですが、

もし、「シグナルを検知する」という要件の場合にはお気を付け下さい。




けど勉強にはなったから良し!!!




以上。