【问题标题】:How two non related process know the same key to allocate same shared memory两个不相关的进程如何知道相同的密钥来分配相同的共享内存
【发布时间】:2014-10-26 11:36:46
【问题描述】:

我正在学习共享内存 IPC。我有点怀疑。

第一季度。共享内存用于相关和不相关的进程。并且一个进程使用shemget 函数分配一个共享内存。这个函数的第一个参数是key。两个不相关的进程如何知道相同的密钥来分配相同的共享内存。

第二季度。当我们使用shmget and shmat 函数时,新的或现有的(在使用 IPC_CREAT | IPC_EXCL 中)内存被创建并映射到进程内存空间。映射了哪些进程内存(如堆,bss)共享内存。在 shmat 函数中,如果我们传递已经在使用的 shmaddr,那么系统将如何运行。

第三季度。在shmat.中给固定内存addredd的用例是什么

【问题讨论】:

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


    【解决方案1】:

    参考1:

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

    他们要么被第三方告知,要么彼此交流。


    参考2b:

    如果我们在 shmat 函数中传递已经在使用的 shmaddr,那么系统将如何运行。

    shmat() 将失败并返回 (void*) -1

    【讨论】:

    • 就像将 semid 保存到文件中一样。并且两个进程都可以读取该 ID。
    • 是的,但是有很多可能性可以实现其中一种方法。 @Abhiteshkhatri
    【解决方案2】:

    Re.2a。内存中没有节。节在目标文件中。

    更详细地说,典型的类 Unix 系统中进程地址空间的组织不一定与可执行文件/目标文件的组织相对应。如果您在 Linux 系统上查看cat /proc/self/maps 的输出,您将看到一个内存区域列表,其中一些在最后一列中标有文件名,一些未标记,还有一些标有类似[stack] 的字符串, [heap][vdso]。标有可执行文件/DSO 文件名称的区域对应于这些文件中的区域,这些区域可能是也可能不是实际的 textbss 部分(无论如何,在进程内存空间中没有任何部分名称的痕迹)。括号中的特殊区域名称不对应任何文件,它们只是为加载程序已知的某些特定目的而创建的区域。未命名区域通常由mmap 创建,但不附加到任何文件。由shm 函数之一创建的共享内存区域可能会被标记为/dev/zeroSYSVnn,其中nn 是传递给shmget() 的键。

    回复。 3. 想到的一种情况是包含内部指针的共享数据结构。

    【讨论】:

    • 关于节在目标文件中而不是在内存中的说法既不准确也不澄清。指出进程地址空间中通常还有很多其他空间,并且内核可以以不一定对应于内存组织的编译器/链接器/库概念的方式将页面映射到其中,这将是有帮助的.
    猜你喜欢
    • 2013-03-16
    • 2017-06-21
    • 2013-11-06
    • 2023-01-10
    • 2013-03-27
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多