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 daran, einen einfachen Zähler zu verwenden, um zu verfolgen, wie viele Prozesse es verwenden.
Ich benutze atexit()
function, um die Bereinigung durchzuführen, aber afaik, wenn das Signal von SIGKILL empfangen wird, werden Prozesse keine Bereinigung durchführen. Wenn also einer dieser Prozesse nicht normal beendet wird, könnte ich es nie schaffen um den Speicher zu reinigen.
Gibt es eine Möglichkeit, selbst nach einem SIGKILL-Signal festzulegen, was zu tun ist? Ich werde wahrscheinlich einen Mechanismus schreiben, der einem Timer ähnlich ist, um zu prüfen, ob Prozesse noch am Leben sind, aber ich würde es wirklich vermeiden wollen, wenn es einen anderen Weg gibt.
Sie können SIGKILL nicht finden.
Allerdings: Sie können weiterhin bereinigen, sofern die Bereinigung von einem anderen Prozess ausgefü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 sehen und die Säuberung durchführen.
In Kombination mit gemeinsam genutztem Speicher wären robuste Mutexe im Shared-Memory-Segment ein großartiges Tool. 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 ausgeführt haben sollte.