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

And*_*ner 40 linux memory shared memory-management

如何确定哪个进程附加到共享内存段?

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    
Run Code Online (Sandbox Code Playgroud)

即如何确定哪个两个进程附加到shmid 98306?

pax*_*blo 42

我认为你不能用标准工具做到这一点.您可以使用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
Run Code Online (Sandbox Code Playgroud)

并且,对于给定的共享存储器段(123456)ipcs -mp,它cpid是3956并且lpid是9999.

然后,通过命令grep 123456 /proc/*/maps,我看到:

/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
Run Code Online (Sandbox Code Playgroud)

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

因此,通过扫描/proc/*/maps"文件",您应该能够发现当前附加到给定段的PID.


cha*_*ess 23

给出上面的例子 - 找到附加到shmid 98306的进程

lsof | egrep "98306|COMMAND"
Run Code Online (Sandbox Code Playgroud)


小智 5

我写了一个名为 who_attach_shm.pl 的工具,它解析 /proc/[pid]/maps 以获取信息。你可以从github下载

示例输出:

shm attach process list, group by shm key
##################################################################

0x2d5feab4:    /home/curu/mem_dumper /home/curu/playd
0x4e47fc6c:    /home/curu/playd
0x77da6cfe:    /home/curu/mem_dumper /home/curu/playd /home/curu/scand

##################################################################
process shm usage
##################################################################
/home/curu/mem_dumper [2]:    0x2d5feab4 0x77da6cfe
/home/curu/playd [3]:    0x2d5feab4 0x4e47fc6c 0x77da6cfe
/home/curu/scand [1]:    0x77da6cfe
Run Code Online (Sandbox Code Playgroud)

  • -1 似乎很消极 - 代码仍然存在好几个月......如果解决方案是“使用 Linux” - 你是否仍然要求他“在答案中包含源代码”? (3认同)