2012-08-01 21 views
16

Sto lavorando a un'applicazione Java che utilizza ganci di arresto per ripulire la terminazione/interruzione del programma, ma ho notato l'implementazione di Cygwin di CTRL-C non sembra attivare i ganci di arresto. In superficie sembra aver interrotto il processo, rinunciando al controllo sulla riga di comando, tuttavia i ganci di arresto del processo non vengono attivati ​​affatto, quindi non si verifica la pulizia.Cygwin CTRL-C (interrupt di segnale) non funziona correttamente - I ganci di arresto JVM non si avviano

In cmd vengono catturati, ma a causa di vari vincoli ho bisogno di farli funzionare in qualche modo in Cygwin.

C'è un modo per lanciare un SIGINT in un processo in esecuzione tramite Cygwin o forse un'alternativa ai ganci di arresto che potrei usare per ripulire l'interruzione e la terminazione?

+0

Stranamente, posso acquisire SIGINT in python, in cygwin, senza problemi. Consulta http://stackoverflow.com/questions/1028687/best-way-to-gracefully-shutdown-a-java-command-line-program per altre idee. – AlG

+0

Questo è strano, i miei tentativi arrestano il processo ma se un SIGINT viene messo fuori, i ganci di shutdown dell'applicazione Java sicuramente non lo catturano - il programma si chiude ma il clean up non viene eseguito. Comunque, grazie a quel thread darò un'occhiata a quel thread. – Quetzalcoatl

+0

Una discussione sul problema: http://cygwin.1069669.n5.nabble.com/CTRL-C-is-not-working-with-java-on-latest-cygwin-1-7-15-td63179.html –

risposta

12

Bash invoca non Cygwin (finestre) eseguibili attraverso un processo bash intermedio (shell bash -> bash -> Java). Quando si digita Ctrl-C, il processo bash ottiene un SIGINT e uccide il processo java secondario, quindi i hook di arresto non vengono richiamati. I processi di Windows non sono a conoscenza di segnali come SIGINT, SIGTERM o SIGKILL.

Come descritto nella documentazione dell'opzione -Xrs, il processo java registra un gestore di controllo della console per l'evento di finestra CTRL_C_EVENT e attiva una terminazione agevole che richiama gli hook di arresto. Per far funzionare Ctrl-C come previsto, è necessario assicurarsi che il processo java lo riceva, ma in questo momento viene intercettato da bash e non passato al processo figlio.

Questo problema può essere riformulato come: Come posso far passare Cygwin Ctrl-C in avanti ai processi della console di windows?

Nota: il comportamento di bash descritto sopra è stato verificato sulla versione 1.7.25.

+0

Bottom line, è un problema cygwin, non un problema java. – HDave