当打开共享内存对象(使用shm_open
)时,为该对象提供名称。每个对象必须具有不同的名称。
有没有办法识别所有当前分配的共享对象的名称?如果是这样,怎么样?
更新:在我看来,这些(如@HristoLliev称之为)系统V共享内存段似乎是这样。 ipcs -m
报告与我期望的类似的细分列表,但不显示名称。
答案 0 :(得分:6)
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
获取)位于不同的名称空间中,并且没有相应的对象名称,只有数字键。