linux - shm_unlink 从 shell ?

标签 linux bash shell shared-memory

我有一个程序可以使用我正在处理的 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.cshm_directory.h将文件名生成为 /dev/your_shm_name。实现 shm_openshm_unlink只需打开并取消链接此文件。所以应该很容易看出 rm/dev/shm/your_shm_name 执行相同的操作,

关于linux - shm_unlink 从 shell ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629713/

相关文章:

linux - 在 bash 中如何为我正在后台处理的任意程序解析和/或重定向标准输出

linux - telnet aspmx.l.google.com 并首先尝试 ipv6

python - 如何显示正在运行的进程列表 Python?

c++ - 从新的和不同的发行版加载 LD_PRELOAD libstdc++.so.6 和 libc.so.6 时出现浮点异常

linux - 不以点开头的文件

python - 如何在 Python 中检查 shell 命令是否结束

bash - 运行 Wine 安装程序时禁用 GUI

linux - 从带有位置参数的字符串执行 BASH shell

linux - 用于输出包含来自平面文件的不同匹配字符串的字符串的脚本

java - 从 Java 同步运行 shell 脚本