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

时间:2014-09-09 15:03:32

标签: linux shared-memory

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

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

更新:在我看来,这些(如@HristoLliev称之为)系统V共享内存段似乎是这样。 ipcs -m报告与我期望的类似的细分列表,但不显示名称。

1 个答案:

答案 0 :(得分:6)

Linux上的

shm_open(3)依赖于tmpfs,通常安装在/dev/shm下。 shm_open()做的是将对象名称转换为文件路径,方法是将其添加到tmpfs文件系统的挂载点。只要共享内存对象没有取消链接,它就会在文件系统中可见,您需要做的就是发出一个简单的ls命令:

$ ls /dev/shm
pulse-shm-1   pulse-shm-2   pulse-shm-3
...

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

$ mount -t tmpfs
tmpfs on /dev/shm type tmpfs (rw)

如果您想知道哪些进程已映射共享内存对象,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

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

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