2016-04-14 10 views
2

Ich habe ein Programm, das ein gemeinsames Speicherobjekt mit shm_open erstellt, an dem ich arbeite. Es versucht, das Objekt mit shm_unlink freizugeben, aber manchmal verursacht ein Programmierfehler, dass es abstürzt, bevor es diesen Aufruf vornehmen kann. In diesem Fall muss ich das Shared-Memory-Objekt "von Hand" auflösen, und ich würde es gerne in einer normalen Shell machen können, ohne C-Code zu schreiben - also mit normalen Linux-Utilities.shm_unlink von der Shell?

Kann es getan werden? This question scheint zu sagen, dass mit unlink(1) auf /dev/shm/path_passed_to_shm_open, aber die Manpages sind nicht klar.

+0

Versuchen Sie unix.stackexchange.com oder superuser.com für nicht-Programmierung Fragen. – Barmar

+0

@Barmar Das scheint mir eine sehr ähnliche Frage zu sein, die ich verlinkt habe. Es könnte so umformuliert werden wie "Kann shared memory Objekte, die über' shm_open' erstellt wurden, entfernt werden, indem man die entsprechende Datei in '/ dev/shm /'? " aber ich denke, das ist ein sehr kleiner Unterschied. Ich glaube nicht, dass diese Frage nicht mehr programmierungsbezogen ist, nur weil ich lieber vorhandene \ * nix-Tools wiederverwenden möchte, als das Rad neu zu erfinden. Ich glaube nicht, dass der Grund für die Abstimmung gut ist, weil "shm_open" definitiv "hauptsächlich für die Programmierung verwendet wird", nicht ein "Allzweck-Computer-Tool". –

Antwort

4

Durch das Aufheben der Verknüpfung der Datei in /dev/shm wird das Shared Memory-Objekt gelöscht, wenn keinem anderen Prozess das Objekt zugeordnet ist.

Im Gegensatz zum gemeinsamen SYSV-Speicher, der im Kernel implementiert ist, sind POSIX-Shared-Memory-Objekte einfach "verschleierte Dateien".

Wenn Sie shm_open und mmap aufrufen, können Sie die folgenden im Prozess Prozesslandkarte sehen (mit pmap -X):

Address Perm Offset Device Inode Mapping 
b7737000 r--s 00000000 00:0d 2267945 test_object 

Das Gerät Haupt- und Nebennummer entsprechen den tmpfs bei /dev/shm montiert (einige Systeme montieren dies at/run, und dann symlink /dev/shm zu /run/shm).

Eine Auflistung des Ordners wird die gleiche Inode-Nummer zeigen:

$ ls -li /dev/shm/ 
2267945 -rw------- 1 mikel mikel 1 Apr 14 13:36 test_object 

Wie jede andere Inode, wird der Raum freigegeben werden, wenn alle Referenzen entfernt werden. Wenn wir das einzige Programm, verweisen diese schließen wir sehen:

$ cat /proc/meminfo | grep Shmem 
Shmem:    700 kB 

Sobald wir die letzte Referenz (erstellt in /dev/shm) entfernen, wird der Raum befreit werden:

$ rm /dev/shm/test_object 
$ cat /proc/meminfo | grep Shmem 
Shmem:    696 kB 

Wenn Sie sind neugierig, Sie kann die entsprechenden Dateien in den glibc-Quellen betrachten. shm_directory.c und shm_directory.h erzeugen Sie den Dateinamen als /dev/your_shm_name. Die Implementierungen shm_open und shm_unlink öffnen und entkoppeln einfach diese Datei. So sollte es leicht zu sehen sein, dass rm /dev/shm/your_shm_name führt die gleiche Operation,

+0

Fantastische Antwort. Ich werde ein wenig warten, um zu akzeptieren, falls jemand anderes etwas hinzufügen möchte, aber das ist großartig. –