从另一个进程访问mmap内存

il_*_*mix 5 c++ ipc mmap

我开始玩mmap了.我正在尝试创建一个示例工作区,然后将其扩展到实际案例.

这就是我想要实现的目标:

过程1:

  • mmap一个文件(实际上是一个设备,但可以用文本文件生成一个例子)

流程2 :(不是从流程1中获取;只是一个独立的流程)

  • 读取进程1映射的内存
  • 改变一些比特
  • 将其写入新文件

我已经阅读了几个示例和文档,但我仍然没有找到如何实现这一点.我缺少的是:

  • 进程2如何在不知道打开文件的情况下访问进程1映射的内存?
  • 如何将mmap内容放在新文件中?我想我必须ftruncate一个新文件,mmap这个文件并memcpy进程1内存映射的内容到进程2内存映射(然后是msync)

侧面信息,我在两个进程之间打开了一个消息队列,因此如果需要,它们可以共享一些消息(例如内存地址/大小,......).

任何提示?

提前致谢!

混合

Jon*_*tez 5

这个答案认为您正在尝试在 linux/unix 上做这些事情。

进程 2 如何访问由进程 1 映射的内存,而不知道有关打开的文件的任何信息?

进程 1 将标志 MAP_SHARED 传递给 mmap[1]。

你可以:

  • A) 使用 unix 域套接字 [2] 共享文件描述符。
  • B) 使用您在消息末尾提到的队列发送文件名。

进程 2 打开带有 MAP_SHARED 标志的 mmap。对进程 1 中 mmaped 内存的修改对于进程 2 是可见的。如果您需要精细控制从进程 1 到进程 2 的更改何时显示,您应该使用 msync[3] 来控制它

如何将 mmap 内容放入新文件中?我想我必须 ftruncate 一个新文件,mmap 这个文件和 memcpy 进程 1 内存映射的内容来处理 2 内存映射(然后 msync)

为什么不使用 write 将 mmaped 内存写为常规内存?

[1] http://man7.org/linux/man-pages/man2/mmap.2.html

[2]在不同进程之间传递文件描述符的可移植方式

[3] http://man7.org/linux/man-pages/man2/msync.2.html