来自shell的shm_unlink?

Pat*_*ins 2 linux bash shell shared-memory

我有一个程序,用shm_open我正在处理的共享内存对象创建.它尝试释放对象shm_unlink,但有时编程错误会导致它在进行调用之前崩溃.在这种情况下,我需要"手动"取消链接共享内存对象,并且我希望能够在普通shell中执行它,而无需编写任何C代码 - 即使用普通的Linux实用程序.

可以吗?这个问题似乎是说,使用unlink(1)/dev/shm/path_passed_to_shm_open,但联机帮助页都不清楚.

Mik*_*ski 6

/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.cshm_directory.h生成文件名为/dev/your_shm_name.实现shm_openshm_unlink只是打开并取消链接此文件.所以应该很容易看到rm /dev/shm/your_shm_name执行相同的操作,