如何确定将什么进程附加到共享内存段?
awagner@tree:/home/awagner$ ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 0 root 777 102400 1 0x00000000 32769 root 774 96 1 dest 0x00000000 98306 awagner 600 393216 2 dest 0x00000000 131075 awagner 600 393216 2 dest
即我如何确定shmid 98306附加了哪些两个进程?
我认为您无法使用标准工具来做到这一点。您可以使用ipcs -mp获取要附加/分离的 最后一个 进程的进程ID,但是我不知道如何使用来获取 所有 附加的进程ipcs。
ipcs -mp
ipcs
对于两个进程相连的段,假设它们都 保持 相连,则可以从创建者PID cpid和最后一个相连的PID中找出lpid这两个进程,但是它们不能扩展到两个以上进程,因此其实用性受到限制。
cpid
lpid
该cat /proc/sysvipc/shm方法似乎受到类似的限制,但是我相信有一种方法可以对/proc文件系统的其他部分进行处理,如下所示:
cat /proc/sysvipc/shm
/proc
当我grep在procfs所有进程的地图上执行时,会得到包含cpid和lpid进程行的条目。
grep
procfs
例如,我从以下获得共享内存段ipcs -m:
ipcs -m
------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 123456 pax 600 1024 2 dest
并且,从ipcs -mp中,cpid是3956和lpid9999对于给定共享存储器段(123456)。
然后,使用命令grep 123456 /proc/*/maps,我看到:
grep 123456 /proc/*/maps
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted) /proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
因此,有 是 一个办法让连接到它的过程。我可以肯定dest状态和(deleted)指示符是因为创建者已在最终分离发生后就将该段标记为要销毁,而不是已经被销毁。
dest
(deleted)
因此,通过扫描/proc/*/maps“文件”,您应该能够发现当前将哪些PID附加到给定的段。
/proc/*/maps