java cygwin interrupt sigint shutdown-hook

java - Cygwin CTRL-C(interrupciones de señal) no funciona correctamente: los ganchos de cierre de JVM no se inician



interrupt sigint (2)

Estoy trabajando en una aplicación Java que utiliza ganchos de apagado para limpiar la terminación / interrupción del programa, pero he notado que la implementación de CTRL-C de Cygwin no parece activar los ganchos de apagado. En la superficie, parece haber interrumpido el proceso, devolviendo el control a la línea de comando, sin embargo, los enganches de apagado del proceso no se activan en absoluto, por lo que no se realiza la limpieza.

En cmd quedan atrapados, pero debido a varias limitaciones, necesito hacer que trabajen en Cygwin.

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


Bash invoca ejecutables que no son cygwin (windows) a través de un proceso bash intermedio (shell bash -> bash -> java). Cuando escribe Ctrl-C, el proceso de bash obtiene un SIGINT y mata el proceso java secundario, por lo que no se invocan los ganchos de apagado. 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 eso activa una terminación elegante que invoca los ganchos de apagado. Para hacer que Ctrl-C funcione como se esperaba, deberías asegurarte de que el proceso Java lo reciba, pero en este momento es interceptado por bash y no pasa al proceso secundario.

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

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