我正在学习共享内存IPC。我有一些疑问。
Q1。共享内存用于相关和非相关过程。并且进程使用shemget
函数分配共享内存。该功能的第一个参数是关键。两个非相关进程如何知道相同的密钥来分配相同的共享内存。
Q2。我们正在使用shmget and shmat
函数,新的或现有的(在使用IPC_CREAT | IPC_EXCL中)内存被创建并与进程内存空间映射。什么是进程内存(如heap,bss)共享内存的部分被映射。并且在shmat函数中,如果我们传递已经在使用的shmaddr,那么系统将如何表现。
Q3。在addredd
shmat.
的用例是什么?
答案 0 :(得分:2)
参考1:
两个非相关进程如何知道分配相同共享内存的相同密钥。
他们要么被第三个被告知,要么彼此沟通。
参考2b:
如果我们传递已经在使用的shmaddr,那么在shmat函数中,系统将如何表现。
shmat()
将失败并返回(void*) -1
。
答案 1 :(得分:1)
Re.2a。内存中没有任何部分。部分位于目标文件中。
更详细地说,典型类Unix系统中进程地址空间的组织不一定与可执行/目标文件的组织相对应。如果查看Linux系统上cat /proc/self/maps
的输出,您将看到一个内存区域列表,其中一些标记了最后一列中文件的名称,一些标记为未标记,另一些标记为{{{{ 1}},[stack]
和[heap]
。标有可执行文件/ DSO文件名称的区域对应于这些文件中的区域,这些区域可能是也可能不是实际的[vdso]
或text
部分(过程中没有部分名称的痕迹)记忆空间无论如何)。括号中的特殊区域名称不对应于任何文件,它们只是为加载程序已知的某些特定目的而创建的区域。未命名的区域通常由bss
创建,但不附加到任何文件。由其中一个mmap
函数创建的共享内存区域可能标有shm
或/dev/zero
,其中SYSVnn
是传递给nn
的密钥。
重新。 3.脑海中浮现的一个案例是包含内部指针的共享数据结构。