如何确定哪个进程连接到共享内存段?

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    

i、 e.如何确定shmid 98306连接了哪两个流程?

推荐答案

我认为用标准工具做不到这一点.您可以使用ipcs -mp来获取last个要附加/分离的进程的进程ID,但我不知道如何使用ipcs来获取all个附加的进程.

对于连接两个进程的段,假设它们都连接了stayed,您可以从创建者PID cpid和最后连接的PID lpid中找出这两个进程,但这不会扩展到两个以上的进程,因此其用途有限.

cat /proc/sysvipc/shm方法似乎也有类似的局限性,但我相信有一种方法可以用于/proc文件系统的其他部分,如下所示:

当我对所有进程的procfs个映射进行grep时,我会得到包含cpidlpid进程行的条目.

例如,我从ipcs -m中获得以下共享内存段:

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 123456     pax        600        1024       2          dest

对于给定的共享内存段(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)

因此,有一种方法可以获取附加到它的进程.我很确定,dest状态和(deleted)指示器是因为在最终分离发生后,创建者已经将该段标记为销毁,而不是它已经被销毁.

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

Linux相关问答推荐

创建守护进程时打开0,1,2描述符

无法下载Centos 7上的存储库的元数据

JSON 转义 CURL/JQ 输出

为什么库中不调用全局变量的构造函数?

如何在 gcc 搜索路径上防止多个版本的 Boost?

我需要制作一个 awk 脚本来解析文件中的文本.我不确定我是否做得正确

如何从 2 个文件中获取内容并使用 shell 脚本将该内容附加到新文件中

如何彻底剥离可执行文件

关于 putenv() 和 setenv() 的问题

如何在 shell 脚本中动态生成新的变量名?

size_t 和 off_t 的用法有什么区别?

我想为 Linux 内核做贡献

如何通过 ssh 判断 ubuntu 服务器上是否存在 php 和 apache

将 CMake 项目导入 Eclipse CDT

在 Linux 上忽略 glob() 中的大小写

在文件夹中的 gzip 文件中查找字符串

区分 Windows 和类 Unix 系统的 Makefile

判断环境变量是否已经设置

使用 SED 将单词的首字母大写

如何制作和应用SVN补丁?