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.
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'). –
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