Come posso & # 8220; intercettare & # 8221; Ctrl + C in un'applicazione CLI?
-
06-07-2019 - |
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.
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.