81 votes

Comment puis-je "intercepter" Ctrl+C dans une application CLI ?

Comment puis-je intercepter Ctrl + C (ce qui normalement devrait tuer le processus) dans une application Java CLI (command line interface) ?

Existe-t-il une solution multi-plateforme (Linux, Solaris, Windows) ?

J'utilise Console 's readLine() mais si nécessaire, je pourrais utiliser une autre méthode pour lire les caractères de l'entrée standard.

118voto

VonC Points 414372
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

Cela devrait permettre d'intercepter le signal, mais seulement en tant qu'étape intermédiaire avant l'arrêt complet de la JVM, donc ce n'est peut-être pas ce que vous recherchez.

Vous devez utiliser un SignalHandler ( sun.misc.SignalHandler ) pour intercepter le SIGINT signal déclenché par un CTRL-C (sous Unix comme sous Windows).
Voir cet article (pdf, pages 8 et 9).

16voto

akf Points 23518

Je suppose que vous voulez vous arrêter en douceur, et ne pas court-circuiter le processus d'arrêt. Si mon hypothèse est correcte, alors vous devriez examiner les points suivants Crochets d'arrêt .

8voto

Amber Points 159296

Pour pouvoir gérer Ctrl+C sans s'arrêter pour une raison quelconque, vous devrez utiliser une forme de gestion des signaux (puisque l'entrée Ctrl+C n'est pas transmise directement à votre application, mais est gérée par le système d'exploitation qui génère un SIGINT qui est ensuite transmis à Java.

Ver http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html pour plus de détails sur le traitement des signaux.

(Si vous souhaitez simplement procéder à un arrêt gracieux, la réponse de akf suffira).

4voto

Henning Points 751

Quelques liens sur la façon de gérer les SIGTERM - c'est le signal que le programme reçoit du côté du système d'exploitation :

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/

Cela devrait fonctionner sur les systèmes d'exploitation POSIX - c'est-à-dire que Mac et Unix devraient fonctionner, sur Windows je ne suis pas sûr, je me souviens avoir entendu dire que c'est aussi compatible POSIX dans une certaine mesure, mais cela pourrait varier beaucoup avec les différentes versions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X