两个非相关进程如何知道相同的密钥来分配相同的共享内存

时间:2014-10-26 11:36:46

标签: c linux linux-kernel ipc shared-memory

我正在学习共享内存IPC。我有一些疑问。

Q1。共享内存用于相关和非相关过程。并且进程使用shemget函数分配共享内存。该功能的第一个参数是关键。两个非相关进程如何知道相同的密钥来分配相同的共享内存。

Q2。我们正在使用shmget and shmat函数,新的或现有的(在使用IPC_CREAT | IPC_EXCL中)内存被创建并与进程内存空间映射。什么是进程内存(如heap,bss)共享内存的部分被映射。并且在shmat函数中,如果我们传递已经在使用的shmaddr,那么系统将如何表现。

Q3。在addredd

中提供固定内存shmat.的用例是什么?

2 个答案:

答案 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.脑海中浮现的一个案例是包含内部指针的共享数据结构。