c++ - 从另一个进程访问 mmap 内存

标签 c++ ipc mmap

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

这是我想要实现的:

过程 1:

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

进程 2:(不是来自进程 1;只是一个独立的进程)

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

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

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

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

有什么提示吗?

提前致谢!

混合

最佳答案

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

how can process 2 access the memory mapped by process 1, without knowing anything about the opened file?

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

您可以:

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

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

how can I put the mmap content in a new file? I suppose I have to ftruncate a new file, mmap this file and memcpy the content of process 1 memory map to process 2 memory map (then msync)

为什么不将 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

关于c++ - 从另一个进程访问 mmap 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36713356/

相关文章:

c++ - std::apply 是否为评估顺序提供保证?

c++ - 在 Windows 上使用 C++ 进行稳健、简单(且快速)的进程间通信

linux - 在 Linux 中,我正在寻找一种方法,让一个进程通过阻塞向另一个进程发出信号

c - 这段用 mmap 读取的代码有什么问题?

linux - 如何通过替换为空页映射来取消映射 mmap 文件

一组的 C++ mmap

c++ - 运行 VS2008 解决方案时出现运行时错误;解决方案正在 build 中

c++ - 引用 QString

用于 boost : asio 的 c++ 文件

linux - 我应该担心管道溢出吗?