我想知道是否有任何合理的可移植方式来获取现有的非共享堆内存并将其转换为共享内存。用例是一块内存,对于我来说太大了,我不想不必要地复制它(即进入一个新的共享内存段),并且由我无法控制的例程分配。主要目标是* nix / POSIX,但我也有兴趣知道它是否可以在Windows上完成。
答案 0 :(得分:0)
您可以尝试使用带有MAP_FIXED标志的mmap()和未共享内存的地址(从堆分配)。但是,如果您使用自己的指针提供 mmap(),那么它将被约束为根据内存页面的大小进行对齐和调整大小(可能由 sysconf()请求)因为映射仅适用于整个页面。
答案 1 :(得分:0)
很多* nixe都有Plan-9的procfs,它允许通过检查/ proc / {pid} / mem
打开读取进程的内存你告诉另一个进程你的pid,大小和基地址,它可以简单地读取数据(或mmap在自己的地址空间中的区域)
编辑:: 显然你不能在没有事先ptrace()的情况下打开/ proc / {pid} / mem,所以这基本上一文不值。
在大多数* nixes下,ptrace(2)
允许附加到进程并读取其内存。
ptrace方法在OSX上不起作用,你需要更多魔法:
Windows下您需要的是ReadProcessMemory
功能
谷歌搜索“什么是$ OSNAME的ReadProcessMemory”似乎返回综合结果集。