Ich bin verwirrt von Linux man pages
zum shmctl()
. Ich verwende folgenden Befehl: shmctl (id , IPC_RMID , 0)
um ein gemeinsames Segment zu entfernen. Das man pages
scheinen sich über die Lebensdauer der Erinnerung zu widersprechen.
Das Manpages Zustand:
IPC_RMID
Markieren Sie das zu zerstörende Segment. Das Segment wird erst tatsächlich zerstört, nachdem der letzte Prozess es getrennt hat (dh wenn das shm_nattch-Element der zugehörigen Struktur shmid_ds Null ist). Der Aufrufer muss der Besitzer oder Ersteller sein oder privilegiert sein. Wenn ein Segment zur Zerstörung markiert wurde, dann wird das (nicht standardmäßige) SHM_DEST-Flag des Felds shm_perm.mode in der zugeordneten Datenstruktur, die von IPC_STAT abgerufen wird, gesetzt.
Wenn ich richtig liege, bedeutet dies, wenn Sie zwei Prozesse haben, die beide an den gemeinsamen Speicher angehängt sind (nennen wir sie Process1
und Process2
), Process1
könnte den gemeinsam genutzten Speicher erstellen, anhängen, abtrennen, den gemeinsam genutzten Speicher zerstören und schließlich beenden. Dann ist die Erinnerung noch bis vorhanden Process2
löst sich auch.
Ist das richtig?
Zweitens, was bedeutet diese Aussage in der man pages
bedeuten:
Der Aufrufer muss sicherstellen, dass ein Segment schließlich zerstört wird; andernfalls bleiben die fehlerhaften Seiten im Speicher oder werden ausgetauscht.
Das macht den Anschein Process1
, da es das Segment zum Löschen markiert hat, müsste blockiert werden, bis alle anderen Prozesse getrennt sind, um sicherzustellen, dass der Speicher gelöscht wird. Aber das scheint der obigen Aussage zu widersprechen. Ich habe auch keine Ahnung, wie das gemacht werden würde (wenn es gemacht werden soll), also wenn das der Fall ist, könnten Sie mir auch erklären, wie ich vorgehen würde.