2015-08-17 2 views
5

Ich versuche, eine Bereinigung vor dem Herunterfahren durchzuführen, wenn eine SIGINT an meine Java-Anwendung gesendet wird, unter Verwendung der Klassen sun.misc.Signal und sun.misc.SignalHandler.Sollte ich den Standard-Signal-Handler auslösen, wenn ich meinen eigenen Handler definiere?

Es erscheint, wenn ich meine Handler registriert das Standardverhalten tritt nicht mehr auf. Aber es gibt ein SignalHandler.SIG_DFL Feld, das "den Standardsignalhandler" enthält. Zuallererst, ist das Verhalten des Standard-Handlers irgendwo dokumentiert? Zweitens, sollte ich das folgende Muster bei der Implementierung meiner eigenen Handler bevorzugen?

SignalHandler handler = new SignalHandler() { 
    public void handle(Signal sig) { 
     ... // handle SIGINT 
     SignalHandler.SIG_DFL.handle(sig); 
    } 
}; 

Edit: Ich bin mir bewusst, das sun.misc Paket nicht tragbar ist, und dass die Abschaltung Haken sind die robustere Art und Weise mit Beendigung der Anwendung zu behandeln. Es genügt zu sagen, dass ich mir dieser Merkmale bewusst bin und Signale direkt verarbeiten muss. Nach meinem Wissen ist der richtige Weg, dies zu tun.

+0

Ich bin nicht sicher, wie Java insbesondere Signale verarbeitet, aber ich glaube, dass es mit der UNIX-Programmierumgebung übereinstimmt; In diesem Fall können Sie das Standardverhalten für jedes Signal in "man signal" sehen (in Linux ist dies in Abschnitt 7; Mac OS scheint es in Abschnitt 3 zu haben). Wahrscheinlich möchten Sie den Standard-Handler für 'SIGINT' nicht aufrufen, es sei denn, Sie möchten ihn beenden (die Standardaktion für' SIGINT'). –

+0

In meinen Tests scheint der Standard-Handler den 'main' Java-Thread zu beenden (nicht zu unterbrechen) und andere Nicht-Daemon-Threads laufen zu lassen. Aber ich zögere, mich auf meine wahrscheinlich unvollständigen und/oder fehlerhaften Beobachtungen zu verlassen. – dimo414

Antwort

0

Wie in einem related question detailliert, sollten Sie nicht Anruf SignalHandler.SIG_DFL in Ihrem SignalHandler, wie Sie ein SEGV verursachen werden. Tatsächlich verwendet die JVM nicht SIG_DFL entweder (für INT, und HUP).

Under the covers alles Java tut, wenn es eines dieser Signale empfängt, ist Anruf System.exit(). Wenn Sie also das Standardverhalten replizieren möchten, rufen Sie einfach System.exit() selbst an. Offensichtlich, wenn Sie nicht als Reaktion auf das Signal beenden möchten, müssen Sie den alten/Standard-Signalhandler überhaupt nicht aufrufen.

Warnung: Dies ist undokumentiertes Verhalten. Es ist unwahrscheinlich, aber durchaus möglich, dass zukünftige Versionen von Java dieses Verhalten ändern könnten.

-1

Beantworten Sie Ihre Frage: Nein Sie brauchen nicht (oder wollen) Standard-Handler aufrufen. Aber diese Klasse ist nicht tragbar. Sie sollten Shutdown-Hook installieren:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
     //your graceful shutdown procedure here 
    } 
}); 
+0

Ich verstehe die Portabilität Sorge, aber wie Shutdown-Haken zu verwenden ist nicht meine Frage. – dimo414

Verwandte Themen