来自shell的shm_unlink?

时间:2016-04-14 17:12:22

标签: linux bash shell shared-memory

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

可以吗? This question似乎在unlink(1)上使用/dev/shm/path_passed_to_shm_open,但联机帮助页不清楚。

1 个答案:

答案 0 :(得分: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

设备主要和次要编号对应于/dev/shm处安装的tmpfs(某些系统将此安装在/ run,然后符号链接/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.cshm_directory.h生成的文件名为/dev/your_shm_name。实现shm_openshm_unlink只是打开和取消链接此文件。因此,应该很容易看到rm /dev/shm/your_shm_name执行相同的操作,