从另一个进程访问mmap内存

7

我开始使用mmap。我正在尝试创建一个示例工作空间,然后将其扩展到实际情况。

这是我想要实现的:

进程1:

  • mmap文件(实际上是设备,但使用文本文件生成示例也可以)

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

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

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

  • 进程2如何访问由进程1映射的内存,而不知道任何有关打开的文件的信息?
  • 如何将mmap内容放入新文件中?我想我必须ftruncate一个新文件,mmap此文件,并将进程1内存映射的内容复制到进程2内存映射中(然后msync)

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

有什么提示吗?

提前致谢!

MIX


mmap不是一种IPC形式。也许你想要shmem? - xaxxon
1个回答

6

本答案考虑您正在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,并将进程1的内存映射内容memcpy到进程2的内存映射中(然后msync)

为什么不只是用write将mmaped内存写成常规内存?

[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和write,我会选择前者,因为在实际应用中,我将不得不对同一个mmapped输出文件进行多次小写操作,并在最后进行msync。我认为这样使用memcpy会更好。 - il_mix
请注意,您无法通过消息队列传递文件描述符。它不起作用。您应该使用Unix域套接字(它使用某些黑魔法来将附加到接收进程中的文件描述符上的内部内容进行分配)。 - Jon Ander Ortiz Durántez
当然,我没有仔细阅读你关于这个问题的答案。由于消息队列已经启动并运行,我将尝试共享文件名。 - il_mix
1
已标记为答案。通过消息队列传递文件名(在最终项目中的设备名称)和内存大小(如果需要,还包括偏移量),然后打开()文件并mmap()内存非常顺利。谢谢! - il_mix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接