如何确定将什么进程附加到共享内存段?
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
文件系统的其他部分进行处理,如下所示:
当我grep
在procfs
所有进程的地图上执行时,会得到包含cpid
和lpid
进程行的条目。
例如,我从以下获得共享内存段ipcs -m
:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 123456 pax 600 1024 2 dest
并且,从ipcs -mp
中,cpid
是3956和lpid
9999对于给定共享存储器段(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()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核