In Java, esiste un metodo speciale Runtime
: addShutdownHook
.
Ciò consente di inizializzare un thread che la JVM tenterà di eseguire appena prima dell'arresto.È il posto dove inserire qualsiasi ripulitura che si desidera eseguire anche in caso di Ctrl-C di chiusura della finestra genitore. Estratto da javadoc: Un hook di arresto è semplicemente un thread inizializzato ma non avviato. Quando la macchina virtuale inizia la sua sequenza di spegnimento, avvierà tutti i ganci di arresto registrati in un ordine non specificato e li lascerà correre simultaneamente. Al termine di tutti gli hook, eseguirà tutti i finalizzatori non inviati se la finalizzazione all'uscita è stata abilitata. Alla fine, la macchina virtuale si fermerà.
Il gancio di arresto viene chiamato anche se il programma termina normalmente. In questo caso, è più pulita per rimuovere il gancio registrato prima di uscire con removeShutdownHook
(ancora un metodo da Runtime
)
EDIT:
nel caso di ambiente Windows, non ci sono segnali reali, ma callback speciali quando il sistema si sta spegnendo. AFAIK, l'hook di sistema viene chiamato correttamente in quel caso, ma ammetto che non l'ho mai provato. In Windows, i processi possono essere chiesto di interrompere con 2 modi:
- messaggi di funzione PostQuitMessage un messaggio WM_QUIT nel processo di ciclo di eventi - normalmente il processo dovrebbe uscire, ma si può fare la sua pulizia (equivallent di Unix SIG_TERM)
- TerminateProcess arresta immediatamente il processo e tutti i suoi fili (equivallent di Unix SIG_KILL)
processi console possono utilizzare un ConsoleControlHandler che può intercettare Ctrl-C, Ctrl-break o Ctrl-eventi Chiusura. I primi due vengono generati tramite tastiera, l'ultimo viene generato quando l'utente chiude la console. Normalmente, Oracle JVM dovrebbe utilizzare il meccanismo di hook del sistema quando ottiene l'evento Ctrl-Close che viene elaborato allo stesso modo di un SIGTERM.
fonte
2014-11-27 09:06:02
Rispondi http://stackoverflow.com/a/20568883/4428150 spiega come farlo da C. – Gustave