【问题标题】:shm_unlink from the shell?shm_unlink 从外壳?
【发布时间】:2016-04-14 17:12:22
【问题描述】:

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

可以吗? This question 似乎说在/dev/shm/path_passed_to_shm_open 上使用unlink(1),但手册页不清楚。

【问题讨论】:

  • 尝试 unix.stackexchange.com 或 superuser.com 解决非编程问题。
  • @Barmar 在我看来,这与我链接的问题非常相似。它可以改写为“可以通过取消链接/dev/shm/ 中的相应文件来删除通过shm_open 创建的共享内存对象吗?”但我认为这是一个非常小的区别。我不认为这个问题不再与编程相关,因为我宁愿重用现有的 *nix 工具而不是重新发明轮子。我认为投票接近的理由不合适,因为shm_open 绝对是“主要用于编程”,而不是“通用计算工具”。

标签: linux bash shell shared-memory


【解决方案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,然后将/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做了同样的操作,

【讨论】:

  • 很棒的答案。如果其他人想添加一些东西,我会稍等片刻接受,但这很好。
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 2012-12-04
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2022-01-12
相关资源
最近更新 更多