Capture SIGINT en Java
Quel est le meilleur moyen de capturer un signal kill en java sans utiliser JNI. Je n'ai découvert que le soleil.misc.Signal et le soleil.misc.SignalHandler et l'avertissement de la possibilité d'être supprimé dans les versions futures.
En utilisant JNI pour appeler un c lib être la seule option que j'ai?
Vous devez vous connecter pour publier un commentaire.
La façon de gérer cela pourrait être d'enregistrer un arrêt crochet. Si vous utilisez (SIGINT)
kill -2
entraînera le programme gracieusement de sortie et d'exécuter l'arrêt de crochets.J'ai essayé le programme de test suivant sur OSX 10.6.3 et sur
kill -9
il n'a PAS exécuter l'arrêt de crochet, ne pense pas qu'il le ferait. Sur unkill -15
il NE exécuter l'arrêt crochet à chaque fois.C'est documenté la façon d'écrire votre propre les gestionnaires de signaux qui ne sont pas de l'arrêt de crochets en Java. Être averti que le
com.sun.misc
paquets et sont appuyés par les nations unies et peuvent être modifiées ou disparaître à tout moment, et sans doute n'existent que dans la JVM de Sun.SIGKILL
(9) est un non catchable signal. C'est un Unix de la conception.Runtime
classe estjava.lang.Runtime
et existe depuis JDK 1.0. LeaddShutdownHook
méthode existe depuis 1.3. Vous pouvez compter sur eux.com.sun
paquets, qui sont mentionnées dans la question, pour ne pas être utilisé.SIGKILL(9)
causes de la machine virtuelle pour abandonner et selon les docs:If the virtual machine aborts then no guarantee can be made about whether or not any shutdown hooks will be run.
docs.oracle.com/javase/7/docs/api/java/lang/...Prendre un coup d'oeil à L'intégration du Signal et de la gestion des exceptions décrivant la JVM HotSpot de la capacité à faire de signal de chaînage. Il implique un peu de niveau C de la ruse si.
Ne serait pas
java.lang.Runtime.addShutdownHook(Thread)
être assez pour que votre but? Ces crochets sont gérés par la JVM lors de la résiliation, y compris la réception deSIGINT
, aussi longtemps que la JVM est en mesure d'effectuer les.Depuis au moins la version 6 de Java, le HotSpot
java
commande a eu un-Xrs
indicateur pour désactiver la JVM les gestionnaires de signaux.Si vous l'utilisez, vous devez mettre en place votre propre
SIGINT
,SIGTERM
,SIGHUP
, etSIGQUIT
gestionnaires, y compris un à appeler explicitementSystem.exit()
.Remarque: cela signifie que le thread dump installation de SIGQUIT est désactivé lorsque le
-Xrs
drapeau est présent.Voir https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABHDABI (également disponible sur le Windows et Solaris
java
homologues).-Xrs
?