一尘不染

如何在Linux中列出附加到共享内存段的进程?

linux

如何确定将什么进程附加到共享内存段?

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附加了哪些两个进程?


阅读 239

收藏
2020-06-07

共1个答案

一尘不染

我认为您无法使用标准工具来做到这一点。您可以使用ipcs -mp获取要附加/分离的 最后一个 进程的进程ID,但是我不知道如何使用来获取 所有
附加的进程ipcs

对于两个进程相连的段,假设它们都 保持 相连,则可以从创建者PID
cpid和最后一个相连的PID中找出lpid这两个进程,但是它们不能扩展到两个以上进程,因此其实用性受到限制。

cat /proc/sysvipc/shm方法似乎受到类似的限制,但是我相信有一种方法可以对/proc文件系统的其他部分进行处理,如下所示:

当我grepprocfs所有进程的地图上执行时,会得到包含cpidlpid进程行的条目。

例如,我从以下获得共享内存段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,我看到:

/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)

因此,有
一个办法让连接到它的过程。我可以肯定dest状态和(deleted)指示符是因为创建者已在最终分离发生后就将该段标记为要销毁,而不是已经被销毁。

因此,通过扫描/proc/*/maps“文件”,您应该能够发现当前将哪些PID附加到给定的段。

2020-06-07