2013-03-24 4 views
12

Ich bin verwirrt von der Linux man pages für shmctl(). Ich verwende den folgenden Befehl: shmctl (id , IPC_RMID , 0), um ein freigegebenes Segment zu entfernen. Die man pages scheinen sich über die Lebensdauer des Speichers zu widersprechen.Shared Memory-Segment mit Shmctl löschen

Der man pages Zustand:

IPC_RMID

Mark das Segment zerstört werden. Das Segment wird nur tatsächlich zerstört, nachdem der letzte Prozess es gelöst hat (d. H. Wenn das Element shm_nattch der zugehörigen Struktur shmid_ds 0 ist). Der Anrufer muss der Eigentümer oder Ersteller sein oder privilegiert sein. Wenn ein Segment zur Vernichtung markiert wurde, wird das (nicht standardmäßige) SHM_DEST-Flag des Felds shm_perm.mode in der zugehörigen Datenstruktur, die von IPC_STAT mit abgerufen wurde, gesetzt.

Wenn ich richtig bin, glaube ich, das bedeutet, wenn Sie zwei Prozesse, die sowohl in den gemeinsamen Speicher anhängen, (lässt sie Process1 und Process2 nennen), Process1 den gemeinsam genutzten Speicher schaffen könnte, befestigen, lösen, zerstören die gemeinsame Speicher und schließlich zu beenden. Dann wird der Speicher noch existieren, bis sich Process2 ebenfalls löst.

Ist das korrekt?

Zweitens: Was bedeutet diese Aussage in der man pages Mittelwert:

Der Anrufer muss sicherstellen, dass ein Segment schließlich zerstört wird; andernfalls bleiben die fehlerhaften Seiten im Speicher oder tauschen.

Dies macht es wie Process1 erscheinen, da es das Segment zum Löschen markiert, brauchen würde, bis alle anderen Prozesse um sind frei stehend zu blockieren, den Speicher zu gewährleisten, wird gelöscht. Dies scheint jedoch der obigen Aussage zu widersprechen. Ich habe auch keine Ahnung, wie das gemacht würde (wenn es gemacht werden sollte), also wenn das der Fall ist, könntest du auch erklären, wie ich das machen würde.

Antwort

15

Ihre erste Argumentation ist richtig. Das gemeinsam genutzte Segment existiert bis beide: Es wird mit IPC_RMID markiert und der letzte Prozess wird getrennt.

Der Zweck des zweiten Fragments ist es, Sie daran zu erinnern, dass Sie in einer Lösung mit gemeinsam genutztem Speicher einen Prozess für die Zerstörung markieren müssen oder dass er für immer im Speicher bleibt. Es könnte sinnvoll sein, sofort nach dem Erstellen des Segments IPC_RMID zu verwenden.

Wenn Sie nicht sicher sind, ob der Speicher erfolgreich freigegeben wurde, können Sie das Programm ipcs verwenden, um die verbleibenden Segmente aufzulisten.