Cygwin CTRL-C (Прерывания сигнала) не работает должным образом - JVM Shutdown Крючки не запускаются - программирование
Подтвердить что ты не робот

Cygwin CTRL-C (Прерывания сигнала) не работает должным образом - JVM Shutdown Крючки не запускаются

Я работаю над Java-приложением, использующим крюки остановки, чтобы очистить процесс прерывания/прерывания программы, но я заметил, что реализация CTRL-C в Cygwin, похоже, не запускает крючки отключения. На первый взгляд, он прервал процесс, отказавшись от управления обратно в командную строку, однако процесс "выключения" не запускается вообще, поэтому очистка не происходит.

В cmd они попадают, но из-за различных ограничений мне нужно как-то заставить их работать в Cygwin.

Есть ли способ запустить SIGINT в запущенном процессе через Cygwin вообще или, возможно, альтернативу крючкам отключения, которые я мог бы использовать для очистки при прерывании и завершении?

4b9b3361

Ответ 1

Bash вызывает исполняемые файлы non-cygwin (windows) через промежуточный процесс bash (bash shell → bash → java). Когда вы набираете Ctrl-C, процесс bash получает SIGINT и убивает дочерний java-процесс, поэтому крючки отключения не вызываются. Процессы Windows не знают о сигналах, таких как SIGINT, SIGTERM или SIGKILL.

Как описано в документации - Xrs, процесс java регистрирует обработчик управления консолью для события Windows CTRL_C_EVENT и запускает изящное завершение который вызывает крючки остановки. Чтобы заставить Ctrl-C работать так, как ожидалось, вам нужно убедиться, что процесс java получает его, но прямо сейчас, что перехвачен bash и не передается дочернему процессу.

Эта проблема может быть пересчитана как: Как я могу передать Cygwin Ctrl-C в процессы консоли Windows?

Примечание. Поведение bash, описанное выше, было проверено в версии 1.7.25.

Ответ 2

Этот поток, возможно, пролил некоторый свет. Некоторые параметры

timeout 1d <command>

или

Патч Ctrl-C от Howard Chu