如何使用mmap和shm_open在多个独立进程之间共享内存

时间:2019-07-19 23:43:17

标签: c++ c linux shared-memory mmap

我想在进程之间共享内存,这些进程独立运行,而不是fork

我已经阅读了mmapshm_open的手册页,但仍然对用法感到困惑。

    在我看来,
  1. 共享内存应该是在不同进程之间映射虚拟内存空间的机制,但是为什么mmapfd参数呢?这是否意味着内存实际上是通过文件共享的?
  2. 此外,shm_open似乎接受文件名作为参数,因此实际上会打开文件吗?
  3. 由于我有多个独立的进程,因此如何通知其他进程共享物理内存地址?

有人可以给出一些示例代码来在两个进程之间共享内存吗?假设我们有一个流程producer和一个consumer流程,它们将如何通过通过mmap共享的内存段进行通信?

1 个答案:

答案 0 :(得分:0)

  1. 从本质上讲,是的-在Unix上,“一切都是文件”。好吧,它不一定是磁盘上的文件,但实际上,您可以根据需要使用磁盘上的文件。

  2. shm_open正式在其自己的命名空间中接受命名共享内存对象的名称。它们需要以单个斜杠开头,并且不应包含另一个斜杠。您可以根据需要命名它们,但是由于它是一个全局名称空间,因此最好生成随机名称(正确使用O_CREAT|O_EXCL来检查冲突)并通过其他一些渠道(例如,在应用程序实例使用的配置文件),这样就不会使其成为系统范围内的单例。实际上,在Linux以及其他常见系统上,共享内存名称空间只是一个目录/dev/shm,通常将其安装为非持久(内存中)文件系统类型,以避免对磁盘进行浪费的写操作。

  3. 没有物理内存地址;它可能会有所不同,有时可能根本不存在(如果换出页面或页面整洁未触动时)。映射的共享内存对象的虚拟地址也不是映射它的不同进程所共有的。标识内存的是共享内存目标文件(由打开的文件描述符对其进行引用)其中的偏移量。因此,为了使用在不同进程的地址空间中独立映射的共享内存,您需要使用与基址的偏移量,而不是绝对指针,在需要指针时将偏移量添加到基址(例如,传递给同步基元用于共享内存中的互斥量,条件变量,信号量等,或者供您自己使用)。