当前位置: 首页 > 面试题库 >

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

秦伯寅
2023-03-14
问题内容

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

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

对于两个进程相连的段,假设它们都 保持 相连,则可以从创建者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附加到给定的段。



 类似资料:
  • 我在共享记忆方面遇到了麻烦。我有一个进程可以创建和写入共享内存段。但我无法获得第二个进程来附加相同的现有段。如果我使用IPC_CREATE标志,我的第二个进程可以创建一个新的共享段,但我需要附加到第一个进程创建的现有共享段。 这是我在第二个过程中的代码: 感谢任何人能给予的任何帮助。我已经为此挣扎了几个小时--这意味着我可能在做一些非常愚蠢的事情,当有人指出我的错误时,最终会让自己感到尴尬:-)

  • 我一直在谷歌搜索这个问题,但还没有找到一个明确的答案,所以我希望有人对windows与Linux的共享内存段有一些了解。 在Windows中,似乎只有内存映射文件的等价物,你必须有一个实际的文件漂浮在某个地方。 我的问题是:这实际上是Windows中唯一的一种共享内存,还是它有一个api来创建非基于文件的共享内存段。

  • 进程A使用shmget创建了一个共享内存“1234”。在此之后,进程A使用SHMAT将内存附加到自身。 “附加”到底是什么意思?是否存在同一内存的两个副本?如果没有,那么这个内存到底存在于哪里?

  • 问题内容: 我的一个项目有一个问题。 我一直在尝试找到一个记录良好的使用共享内存的示例,但没有成功。 基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值: current_path( 它是一个 char )_ 和 file_name( 它也是 _char ) 。 根据命令参数,将启动一个新进程,该进程需要读取和修改存储在共享内存中的 current_path 变量,而 file_name

  • 问题内容: 我已经尝试了好几个小时,并且用谷歌搜索了所有我想到的东西,但是我快要疯了。 我有一个结构: 直到以后,我才知道int (矩阵)和char 的大小。 完成后,我将创建共享内存,如下所示: 没问题 然后,我给ctrl-> rows和collumns赋一个值,并将0赋给所有矩阵。 但是之后,我在char *和bam中写了一些段错误。 调试程序时,我看到mat和IDs_row这两个指针都为nu

  • 通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核