2012-08-01 13 views
16

Pracuję nad aplikacją Java, która wykorzystuje haki wyłączania w celu oczyszczenia po zakończeniu/przerwaniu programu, ale zauważyłem że implementacja CTRL-C przez Cygwin wydaje się nie uruchamiać haków zamykających. Wydaje się, że na powierzchni przerwał proces, rezygnując z kontroli z linii poleceń, jednak haki wyłączania procesu nie są w ogóle uruchamiane, więc nie następuje czyszczenie.Cygwin CTRL-C (przerwań sygnału) nie działa prawidłowo - JVM Shutdown Haki nie uruchamiające

W cmd zostają złapani, ale z powodu różnych ograniczeń muszę jakoś zmusić ich do pracy w Cygwin.

Czy jest jakiś sposób, aby wystrzelić SIGINT w działającym procesie przez Cygwin w ogóle, czy może alternatywa dla haków zamykających, których mogłabym użyć do czyszczenia po przerwie i przerwie?

+0

Dziwne, mogę przechwycić SIGINT w python, w cygwin, bez problemu. Sprawdź http://stackoverflow.com/questions/1028687/best-way-to-gracefully-shutdown-a-java-command-line-program dla innych pomysłów. – AlG

+0

To dziwne, moje próby kończą proces, ale jeśli SIGINT jest wyłączony, moje haki aplikacji Java na pewno go nie przechwytują - program wychodzi, ale czyszczenie się nie uruchamia. Przejrzę jednak przez ten wątek, dzięki. – Quetzalcoatl

+0

Dyskusja na temat problemu: http://cygwin.1069669.n5.nabble.com/CTRL-C-is-not-working-with-java-on-latest-cygwin-1-7-15-td63179.html –

Odpowiedz

12

Basha odwołuje nie cygwin (okna) wykonywalne przez pośredni procesu bash (atakujących powłoki -> atakujących -> Java). Kiedy wpiszesz Ctrl-C, proces bash otrzyma SIGINT i zabije proces potomny java, więc haczyki zamknięcia nie zostaną wywołane. Procesy Windows nie są świadome sygnałów takich jak SIGINT, SIGTERM lub SIGKILL.

Jak opisano w dokumentacji opcji -Xrs, proces java rejestruje procedurę obsługi konsoli dla zdarzenia okna CTRL_C_EVENT i uruchamia pełne wdzięku zakończenie, które wywołuje haki zamykające. Aby Ctrl-C działał zgodnie z oczekiwaniami, musisz upewnić się, że proces java go odbierze, ale teraz jest przechwytywany przez bash i nie przekazywany dalej do procesu potomnego.

Ten problem można zmienić: Jak mogę Cygwin przekazać Ctrl-C do przodu w procesach konsoli systemu Windows?

Uwaga: Opisane zachowanie basha zostało zweryfikowane w wersji 1.7.25.

+0

Dolna linia, to problem cygwin, a nie problem java. – HDave

Powiązane problemy