Entfernen posix shared memory, wenn nicht in Gebrauch?
Gibt es eine Möglichkeit, linux-spezifisch oder nicht, haben posix-shared-memory-Segmente (die mit shm_open()
) entfernt, wenn kein Prozess mit Ihnen. also haben Sie Referenz-gezählt und vom system entfernen, wenn die Referenz wird 0
Ein paar Hinweise:
-
Zur Gründung einer atexit-handler zu entfernen, Sie funktioniert nicht, wenn das Programm abstürzt.
-
Derzeit ist die linux-spezifische Art und Weise, die ich einbetten der pid-in den segment-Namen, und versuchen Sie zu finden, nicht verwendete Segmente Fuß /dev/shm in einem externen Programm. Das hat den Nachteil, dass in regelmäßigen Abständen reinigen Sie Sie extern in einer eher hackish Weg.
-
Als Programm kann ausgeführt werden, mehrere Kopien, mit einem gut definierten Namen für das segment ein, dass das Programm verwendet, wenn es startet, ist nicht möglich.
- Fragen Sie, ob es eine system-library-Ansatz, um diese, anstatt es von hand?
- Man könnte den Gebrauch von gdb zum Debuggen Ihrer Anwendung, damit es nicht abstürzt? Das lindert das problem, dass crashy Anwendungen können nicht Aufräumen hinter sich...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht - zumindest auf Linux, der kernel nicht enthalten alles, was, die dies tun können. Es ist bis auf einige Anwendungen zu nennen shm_unlink() irgendwann loswerden ein shared-memory-segment.
Wenn es einen Punkt in Ihrem Programm die Ausführung, wenn es ist bekannt, dass alle Prozesse, die zum öffnen des shared-memory-segment haben dies bereits getan, können Sie sicher aufheben, es. Die Verknüpfung entfernt das Objekt aus dem globalen namespace, aber es sill verweilt so lange es mindestens einen Prozess, halten Sie Ihre Datei-descriptor zu öffnen. Wenn ein Absturz Auftritt, nach diesem Punkt, die den Datei-descriptor wird automatisch geschlossen und der Referenzzähler wird dekrementiert. Sobald keine offenen Deskriptoren zu den ungebundenen shared-memory-block bleiben, ist es gelöscht.
Dies ist nützlich, in den folgenden Szenario: ein Prozess erzeugt ein shared-memory-block, unterbricht die Verbindung und dann Gabeln. Das Kind erbt die Datei-Deskriptor und kann die shared-memory-block für die Kommunikation mit den Eltern. Sobald beide Prozesse zu beenden, wird die Sperre automatisch entfernt, da beide Dateideskriptoren geschlossen.
Zwar aufgehoben, die shared-memory-block nicht verfügbar ist für andere Prozesse, um es zu öffnen. In der Zwischenzeit, wenn Sie eine Verwendung
shm_open()
mit dem gleichen Namen wie die ungebundenen block, eine neue und völlig unterschiedliche shared-memory-block erstellt, statt.Nehmen wir an, die meisten komplizierten Fall:
Sehe ich zwei mögliche Lösungen und würde gern feedback auf Sie, denn das internet ist schrecklich leise auf diese Frage:
Speichern die pid (oder eine weitere spezifische Prozess-id, wenn Sie eine haben), der Letzte Prozess, der schrieb an den gemeinsamen Speicher im shared memory als eine Sperre. Dann könnten Sie tun, sth. wie der folgende pseudo-code:
Dadurch wird sichergestellt, dass die letzten Schriftsteller starben nicht während des Schreibens. Shared memory ist immer noch anhaltende länger als alle Ihre Prozesse.
Verwenden reader - /writer-lock-Datei, um herauszufinden, wenn jeder Prozess ist der erste Prozess der öffnung des shared memory-Objekts. Der erste Prozess kann dann erneut initialisieren des shared memory:
Datei sperren scheint die einzige (?) Mechanismus auf POSIX-Systemen, deaktiviert sich automatisch, wenn der Prozess stirbt. Leider die Liste der Vorbehalte, Sie zu verwenden ist sehr, sehr lange. Der Algorithmus setzt Voraus
flock
ist gestützt auf das zugrundeliegende Dateisystem zumindest auf der lokalen Maschine. Der Algorithmus kümmert sich nicht, wenn die sperren sind eigentlich sichtbar für andere Prozesse, die auf NFS-Dateisysteme oder nicht. Sie ist nur sichtbar für alle Prozesse, die Zugriff auf das shared memory Objekt.open(lockfile, O_RDONLY | O_CREAT | O_EXLOCK | O_NONBLOCK, ...)
wird die Datei erstellt wenn Sie nicht existiert, aber wird es geöffnet, wenn es bereits vorhanden ist.Ich einen Weg gefunden, mit einem system-Befehl und dem Linux-Befehl "fuser" die es erlauben, die Liste der Prozesse, die eine Datei geöffnet haben. Auf diese Weise können Sie überprüfen, ob das shared-memory-Datei (befindet sich in /dev/shm") noch in Verwendung ist und es löschen, wenn nicht. Beachten Sie, dass die Vorgänge prüfen /löschen /erstellen muss beigefügt werden, in einem inter-Prozesse den kritischen Abschnitt mit einem benannten mutex oder die benannte semaphore oder Datei sperren.
Für die shared-memory -, erstellt mit sysV-API ist es möglich, solch ein Verhalten. Nur mit Linux. Es ist nicht POSIX-shared-memory, sondern kann für Sie arbeiten.
In dem Buch The Linux Programming Interface eine der möglichen Parameter für shmctl() beschrieben wird, auf folgende Weise.
Konnte Sie nicht einfach eine Globale counting semaphore zur Referenz zählen? Wickeln Sie die attach-und detach-Anrufe, so dass die semaphore wird um eins erhöht, wenn Sie Anhängen, um den Speicher und verringert, wenn Sie sich trennen. Lassen Sie die segment, wenn ein trennen verringert den semaphor auf null.
Nicht sicher, ob das unten funktioniert oder machbar ist. Aber meine versuchen.
Warum nicht Sie führen das Helfer-Programm, die ausgeführt wird, jedes mal das Programm abgestürzt.
ie:
Myprogram wird ausgeführt, wenn der Prozess abstürzt, und wahrscheinlich kann man noch mehr ausprobieren.
sehen
Hoffe, dass dies hilft, um einige zu verlängern.