Shared-Memory-Segment mit shmctl löschen

Lesezeit: 2 Minuten

Benutzer-Avatar
MrHappyAsthma

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.

Deine erste Überlegung ist richtig. Das freigegebene Segment besteht solange, bis beide: es mit gekennzeichnet ist IPC_RMID und letzter Prozess löst sich.

Der Zweck des zweiten Fragments besteht darin, Sie daran zu erinnern, dass Sie in einer Lösung, die Shared Memory verwendet, einen Prozess haben müssen, der es zur Zerstörung markiert, oder es bleibt für immer im Speicher/Austausch. Es könnte eine gute Idee sein, es zu verwenden IPC_RMID unmittelbar nach dem Erstellen des Segments.

Wenn Sie nicht sicher sind, dass Sie den Speicher erfolgreich freigegeben haben, können Sie verwenden ipcs Programm, um verbleibende Segmente aufzulisten.

  • Hätten Sie einen Einblick in dieses Problem stackoverflow.com/questions/66875715/… ?

    – Bruce Adams

    30. März 2021 um 17:33 Uhr

1159170cookie-checkShared-Memory-Segment mit shmctl löschen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy