我有一个程序可以使用我正在处理的 shm_open
创建一个共享内存对象。它尝试使用 shm_unlink
释放对象,但有时编程错误会导致它在调用之前崩溃。在这种情况下,我需要“手动”取消链接共享内存对象,并且我希望能够在普通 shell 中完成此操作,而无需编写任何 C 代码——即使用普通 Linux 实用程序。
可以吗? This question似乎说在 /dev/shm/path_passed_to_shm_open
上使用 unlink(1)
,但联机帮助页不清楚。
最佳答案
取消链接 /dev/shm
中的文件将删除共享内存对象,如果没有其他进程映射该对象的话。
与在内核中实现的 SYSV 共享内存不同,POSIX 共享内存对象只是“伪装的文件”。
当你调用shm_open和mmap时,你可以在process进程图中看到如下内容(使用pmap -X
):
Address Perm Offset Device Inode Mapping
b7737000 r--s 00000000 00:0d 2267945 test_object
设备主次设备号对应挂载在/dev/shm
的tmpfs(有些系统挂载在/run,然后符号链接(symbolic link)/dev/shm
到/run/shm
).
文件夹列表将显示相同的 inode 编号:
$ ls -li /dev/shm/
2267945 -rw------- 1 mikel mikel 1 Apr 14 13:36 test_object
与任何其他 inode 一样,当所有引用都被删除时,空间将被释放。如果我们关闭唯一引用它的程序,我们会看到:
$ cat /proc/meminfo | grep Shmem
Shmem: 700 kB
一旦我们删除最后一个引用(在 /dev/shm
中创建),空间将被释放:
$ rm /dev/shm/test_object
$ cat /proc/meminfo | grep Shmem
Shmem: 696 kB
如果你很好奇,你可以查看 glibc 源代码中的相应文件。 shm_directory.c和 shm_directory.h将文件名生成为 /dev/your_shm_name
。实现 shm_open和 shm_unlink只需打开并取消链接此文件。所以应该很容易看出 rm/dev/shm/your_shm_name
执行相同的操作,
关于linux - shm_unlink 从 shell ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629713/