【问题标题】:Access mmap memory from another process从另一个进程访问 mmap 内存
【发布时间】:2016-08-11 08:02:03
【问题描述】:

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

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

过程 1:

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

进程 2:(不是从进程 1 派生的;只是一个独立进程)

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

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

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

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

有什么提示吗?

提前致谢!

混合

【问题讨论】:

  • mmap 不是 IPC 的一种形式。也许你想要 shmem?

标签: c++ ipc mmap


【解决方案1】:

此答案认为您正在尝试在 linux/unix 上执行此操作。

进程 2 如何在不知道打开的文件的情况下访问进程 1 映射的内存?

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

你可以:

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

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

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

为什么不将映射内存写入普通内存?

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

[2]Portable way to pass file descriptor between different processes

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

【讨论】:

  • 感谢您的回答。我将尝试通过消息队列传递文件描述符,看看是否一切正常。我想我也必须通过内存大小。关于 memcpy/msync vs write,我会选择前者,因为在实际应用中,我必须在同一个 mmapped 输出文件上进行几次小写入,最后使用 msync。我认为使用 memcpy 会表现得更好。
  • 小心,您不能通过消息队列传递文件描述符。它行不通。您应该使用 unix 域套接字(在接收过程中分配附加到文件描述符的内部内容会产生一些黑魔法)。
  • 当然,我没有仔细阅读您对此的回答。由于消息队列已经启动并运行,我将尝试共享文件名。
  • 标记为答案。通过消息队列传递文件名(最终项目中的设备名称)和内存大小(以及偏移量,如果需要),而不是 open() 文件和 mmap 内存就像一个魅力。谢谢!
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 2018-05-07
  • 2012-05-18
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多