2010-07-29 14 views
7

Ich arbeite an einem Programm, das gemeinsam genutzten Speicher verwendet. Mehrere Instanzen dieses Programms verbinden sich entweder mit einem vorhandenen oder erstellen es neu und geben es an OS zurück, wenn keine anderen Prozesse vorhanden sind, oder trennen es einfach und beenden es. Ich dachte an einen einfachen Zähler, um zu verfolgen, wie viele Prozesse ihn benutzen.Wie mache ich eine Säuberung nach SIGKILL?

Ich benutze atexit() Funktion, um die Aufräumarbeiten zu tun, jedoch afaik, nach dem Empfang von SIGKILL-Signal, Prozesse werden keine Aufräumarbeiten, so dass, wenn einige dieser Prozesse nicht normal beenden, könnte ich nie in der Lage sein säubere den Speicher.

Gibt es eine Möglichkeit, festzulegen, was auch nach einem SIGKILL-Signal zu tun ist? Ich werde wahrscheinlich einen Mechanismus schreiben, der einem Timer ähnlich ist, um zu überprüfen, ob Prozesse noch am Leben sind, aber ich würde es wirklich gerne vermeiden, wenn es einen anderen Weg gäbe.

Antwort

16

Nein, SIGKILL kann in keiner Weise von Ihrer Anwendung abgefangen werden - falls dies möglich ist, könnte die Anwendung sie ignorieren, was ihren Zweck zunichte machen würde.

13

Sie können SIGKILL nicht abfangen.

Allerdings: Sie können immer noch aufräumen, vorausgesetzt, dass die Bereinigung von einem anderen Prozess durchgeführt wird. Es gibt viele Strategien, die Sie hier verfolgen können, damit Ihr Prozess Ihre anderen Prozesse sehen und verschwinden lässt.

Zum Beispiel: Sie könnten einen Unix-Domain-Socket an einem bekannten Ort haben, den die Haushälterin hört; Jeder Slave-Prozess öffnet den Socket, um anzuzeigen, dass er das Shared-Memory-Segment verwendet. Wenn ein Slave aus irgendeinem Grund aussteigt, wird der Socket geschlossen. Die Haushälterin kann dies beobachten und die Säuberung durchführen.

+0

+1 für die Erläuterung eines Konzepts – Robert

4

Kombiniert mit dem gemeinsamen Speicher, robuste Mutexe im Shared-Memory-Segment wäre ein großartiges Werkzeug. Wenn ein Prozess stirbt, während eine Sperre auf einem robusten Mutex gehalten wird, erhält der nächste Prozess, der versucht, ihn zu sperren, EOWNERDEAD und kann die Bereinigung durchführen, die der ursprüngliche Besitzer hätte durchführen sollen.