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