2012-08-01 23 views
16

Estoy trabajando en una aplicación Java que utiliza los ganchos de apagado para limpiar en la terminación/interrupción del programa, pero he notado que la implementación de Cygwin de CTRL-C no parece desencadenar los ganchos de cierre. En la superficie, parece haber interrumpido el proceso, cediendo el control a la línea de comandos, sin embargo, los ganchos de cierre del proceso no se activan en absoluto, por lo que la limpieza no se produce.Cygwin CTRL-C (interrupciones de señal) no funciona correctamente - JVM Shutdown Hooks no se inicia

En cmd quedan atrapados, pero debido a varias limitaciones necesito de alguna manera hacer que funcionen en Cygwin.

¿Hay alguna manera de disparar un SIGINT en un proceso en ejecución a través de Cygwin, o quizás una alternativa a los ganchos de apagado que podría utilizar para limpiar en la interrupción y la terminación?

+0

Extraño, puedo capturar SIGINT en python, en cygwin, sin problema. Consulte http://stackoverflow.com/questions/1028687/best-way-to-gracefully-shutdown-a-java-command-line-program para obtener otras ideas. – AlG

+0

Es extraño, mis intentos cerraron el proceso, pero si se activa un SIGINT, los ganchos de cierre de mi aplicación Java definitivamente no lo están captando: el programa se cierra pero la limpieza no se ejecuta. Echaré un vistazo a ese hilo, gracias. – Quetzalcoatl

+0

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

Respuesta

12

Bash invoca no cygwin (ventanas) ejecutables a través de un proceso de golpe intermedio (shell bash -> fiesta -> Java). Cuando escribe Ctrl-C, el proceso bash obtiene un SIGINT y elimina el proceso java hijo, por lo que los ganchos de cierre no se invocan. Los procesos de Windows no conocen señales como SIGINT, SIGTERM o SIGKILL.

Como se describe en la documentación de la opción -Xrs, el proceso java registra un controlador de control de consola para el evento de ventanas CTRL_C_EVENT y desencadena una terminación elegante que invoca los ganchos de cierre. Para que Ctrl-C funcione como se espera, debe asegurarse de que el proceso Java lo reciba, pero ahora es interceptado por bash y no pasado al proceso secundario.

Este problema se puede replantear como: ¿Cómo puedo hacer que Cygwin pase Ctrl-C hacia los procesos de la consola de Windows?

Nota: El comportamiento de bash descrito anteriormente se verificó en la versión 1.7.25.

+0

En pocas palabras, es un problema de cygwin, no es un problema de Java. – HDave

Cuestiones relacionadas