Question

Comment puis-je intercepter Ctrl + C (ce qui normalement tuerait le processus) dans une application Java CLI (interface de ligne de commande)?

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

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

Était-ce utile?

La solution

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

Cela devrait pouvoir intercepter le signal, mais uniquement comme une étape intermédiaire avant que la machine virtuelle Java ne s'éteigne complètement, afin que ce ne soit peut-être pas ce que vous cherchez.

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

Autres conseils

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

Pour pouvoir gérer Ctrl + C sans arrêter pour une raison quelconque, vous devez utiliser une forme de traitement du signal (depuis le L'entrée Ctrl + C n'est pas réellement transmise directement à votre application, mais elle est gérée par le système d'exploitation qui génère un SIGINT qui est ensuite transmis à Java.

Voir http://www.oracle.com/technetwork/ java / javase / signs-139944.html pour plus de détails sur la gestion des signaux.

(Si vous souhaitez simplement vous arrêter en douceur, la réponse de akf suffira.)

Quelques liens sur la façon de gérer 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 / signs.html

http://www.ibm.com/developerworks/java/ bibliothèque / i-signalhandling /

Cela devrait fonctionner sous les systèmes d’exploitation POSIX - c’est-à-dire que Mac et Unix devraient fonctionner, sous Windows, je ne suis pas sûr. Je me souviens avoir entendu dire qu’il était également compatible POSIX dans une certaine mesure, mais pouvait être très volumineux avec des versions différentes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top