查找当前使用的共享内存名称的技术

Sco*_*ter 3 linux shared-memory

当打开共享内存对象(使用shm_open)时,为该对象提供名称.每个对象必须具有不同的名称.

有没有办法识别所有当前分配的共享对象的名称?如果是这样,怎么样?

更新:在我看来,这些(就像@HristoLliev所称的那样)系统V共享内存段. ipcs -m报告类似于我期望的段列表,但不显示名称.

Hri*_*iev 9

shm_open(3)在Linux上依赖tmpfs,通常安装在/dev/shm.是什么shm_open()做的是通过与的挂载点前面加上对象名称转换为文件路径tmpfs文件系统.只要共享内存对象没有取消链接,它就会在文件系统中可见,您需要做的就是发出一个简单的ls命令:

$ ls /dev/shm
pulse-shm-1   pulse-shm-2   pulse-shm-3
...
Run Code Online (Sandbox Code Playgroud)

某些Linux发行版tmpfs安装在不同的挂载点下.为了找出问题所在,问题:

$ mount -t tmpfs
tmpfs on /dev/shm type tmpfs (rw)
Run Code Online (Sandbox Code Playgroud)

如果您想知道哪些进程已映射共享内存对象,该lsof命令是您的朋友:

$ lsof /dev/shm
COMMAND     PID     USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
kded4     30657   hristo mem    REG   0,16 67108904 294877 /dev/shm/pulse-shm-1
kded4     30657   hristo mem    REG   0,16 67108904 294868 /dev/shm/pulse-shm-2
knotify4  30687   hristo mem    REG   0,16 67108904 294876 /dev/shm/pulse-shm-3
pulseaudi 30717   hristo mem    REG   0,16 67108904 294868 /dev/shm/pulse-shm-4
shm.x     31878   hristo DEL    REG   0,16          305893 /dev/shm/asd
Run Code Online (Sandbox Code Playgroud)

未链接的共享对象在文件系统中不再可见,但如果通过某个进程映射它们可能仍然存在,就像上面列表中的最后一个进程一样 - DEL在该FD字段中表示相应的文件已被删除.

请注意,System V共享内存段(由其获得ipcs -m)位于不同的名称空间中,并且没有相应的对象名称,只有数字键.

  • System V IPC 对象没有名称。它们只有数字键,并且有一个方便的函数“ftok()”,它接受文件名并将文件的 inode 和设备号的一部分与附加的 8 位 ID 组合起来,以生成数字键(请参阅[此处] (http://code.metager.de/source/xref/gnu/glibc/sysvipc/ftok.c)它是如何完成的)。该函数不可逆,您不能简单地获取用于生成密钥的文件名(因为它仅保留 inode 编号的低 16 位)。 (2认同)