Domanda

Come posso intercettare Ctrl + C (che normalmente ucciderebbe il processo) in un'applicazione Java CLI (riga di comando)?

Esiste una soluzione multipiattaforma (Linux, Solaris, Windows)?

Sto usando readLine () di Console , ma se necessario, potrei usare qualche altro metodo per leggere i caratteri dall'input standard.

È stato utile?

Soluzione

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

Questo dovrebbe essere in grado di intercettare il segnale, ma solo come un passo intermedio prima che la JVM si spenga completamente, quindi potrebbe non essere quello che stai cercando.

È necessario utilizzare un SignalHandler ( sun.misc.SignalHandler ) per intercettare il segnale SIGINT attivato da un Ctrl + C (su Unix e su Windows).
Vedi questo articolo (pdf, pagina 8 e 9).

Altri suggerimenti

Suppongo che tu voglia arrestare con garbo e non cortocircuitare il processo di spegnimento. Se la mia ipotesi è corretta, allora dovresti guardare Ganci di arresto .

Per essere in grado di gestire Ctrl + C senza spegnerlo per qualche motivo, dovrai usare una qualche forma di gestione del segnale (dal Ctrl + C l'input non viene in realtà passato direttamente alla tua applicazione, ma viene invece gestito dal sistema operativo che genera un SIGINT che viene quindi passato a Java.

Vedi http://www.oracle.com/technetwork/ java / javase / signal-139944.html per dettagli sulla gestione del segnale.

(Se vuoi solo chiudere con grazia, la risposta di akf sarà sufficiente.)

Alcuni link su come gestire SIGTERM - questo è il segnale che il programma sta ricevendo dal lato del sistema operativo:

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

http: //java.sun .com / JavaSE / 6 / webnotes / problemi / TSG-VM / html / signals.html

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

Ciò dovrebbe funzionare sui sistemi operativi POSIX - vale a dire Mac e Unix dovrebbero funzionare, su Windows non sono sicuro, ricordo di aver sentito che è anche POSIX compatibile in una certa misura, ma potrebbe essere varty molto con versioni diverse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top