2009-09-11 11 views
15

Mam autonomiczną aplikację, w której muszę monitować użytkownika o potwierdzenie w oknie dialogowym, aby zapisać zmiany dokonane przez niego, gdy próbuje zamknąć system przez start-->shutdown.Obsługa sygnałów za pomocą "TERM"

Dowiedziałem się, że korzystając z signalhandlers możemy to zrobić.
Czy ktoś może mi pomóc w jaki sposób korzystać z obsługi sygnałów

+1

Jak radzić sobie z SIGINT pytanie: http://stackoverflow.com/questions/2541475/capture- sigint-in-java –

Odpowiedz

33

Aktualizacja maj 2012 (2 i pół roku później)

Trejkaz Komentarze:

W aktualnych wersjach Java ten kod obsługi sygnału nie działa, ponieważ sygnał "INT" jest "zarezerwowany przez VM lub system operacyjny".
Dodatkowo, żadna inna ważna nazwa sygnału nie zostanie wywołana, gdy coś poprosi o zamknięcie aplikacji (ja tylko skrupulatnie przetestowałem wszystkie te, o których mogłem się dowiedzieć ...)
Haczyk zamknięcia działa, ale okazuje się, że naszym przypadku nie jest wypalanie, więc następnym krokiem jest oczywiście uciekać się do rejestracji programu obsługi za JVM powrotem

w rozdziale „Integrating Signal and Exception Handling” z „Troubleshooting Guide for HotSpot VM” wymienia sygnały „SIGTERM, SIGINT, SIGHUP” tylko dla systemów operacyjnych Solaris i Linux.
Wspomniano tylko o obsłudze wyjątków w systemie Windows.


Original odpowiedź (wrzesień 2009)

ShutdownHook powinien być w stanie obsługiwać tę sprawę

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    public void run() { 
     // what you want to do 
    } 
})); 

(z caveats)
Zobacz także:

jako ilustrację prostą obsługą sygnału:

public class Aaarggh { 
    public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 
     System.out.println(
      "Aaarggh, a user is trying to interrupt me!!"); 
     System.out.println(
      "(throw garlic at user, say `shoo, go away')"); 
     } 
    }); 
    for(int i=0; i<100; i++) { 
     Thread.sleep(1000); 
     System.out.print('.'); 
    } 
    } 
} 
+0

Fajnie - ale to zależy od drzewa sun.misc. *, które jest teraz przestarzałe. I podpowiedzi, jakiej klasy powinniśmy używać? – zigdon

+0

@zigdon: Nie jestem pewien. Klasy te są nadal dostępne w jdk lub openjdk, http://www.docjar.com/docs/api/sun/misc/SignalHandler.html i nawet jeśli nie są częścią obsługiwanego interfejsu publicznego (http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html), ale inne rozwiązania mogą obejmować JVMTI lub JMX (http://stackoverflow.com/questions/5023520/sending-signals-to-a -running-jvm) – VonC

+1

W obecnych wersjach Javy ten kod obsługi sygnału nie działa, ponieważ sygnał "INT" jest "zarezerwowany przez VM lub system operacyjny". Dodatkowo, żadna z innych poprawnych nazw sygnałów nie zostanie wywołana, gdy coś poprosi o zamknięcie aplikacji (ja tylko skrupulatnie przetestowałem wszystkie te, o których mogłem się dowiedzieć ...) Haczyk zamykający działa głównie, ale okazuje się, że w naszym przypadku nie jest on uruchamiany, więc kolejnym krokiem jest oczywiście zarejestrowanie handler'a za plecami JVM. :) – Trejkaz