gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:22:23 28 4
gpt4 key购买 nike

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

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

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

谁能给出一些在两个进程之间共享内存的示例代码?比如说,我们有进程 producer 和一个 consumer 进程,它们将如何通过 mmap 共享的内存段进行通信?

最佳答案

  1. 本质上,是的——在 unix 上“一切皆文件”。不完全是,它不一定是磁盘文件,但事实上,如果需要,您可以使用磁盘文件。

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

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

关于c++ - 如何使用mmap和shm_open在多个独立进程之间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com