2010-08-10 33 views
1

我想知道是否有采取现有的非共享堆内存并把它转换成共享内存中的任何合理的可移植的方式。用例是一块内存,对我来说太大了,不想将它复制到不必要的地方(即,到一个新的共享内存段中),并且这些内存是由我的控制之外的例程分配的。主要目标是* nix/POSIX,但我也有兴趣知道它是否可以在Windows上完成。有没有办法将非共享堆内存转换为共享内存?主要目标的* nix

回答

0

您可以尝试使用mmap()与MAP_FIXED标志和你的非共享内存的地址(从堆中分配)。不过,如果你提供mmap()的用自己的指针则受限于根据内存页的大小来排列和大小,因为映射(可以通过的sysconf()请求)仅适用于整个页面。

+0

重新MAP_FIXED,我认为这一切映射的前身是在地图上的位置,而不是共享内存。 – michaeljt 2010-08-10 15:40:11

0

许多*水妖有计划-9的PROCFS允许打开通过检查的/ proc/{PID}/MEM

你告诉其他进程的PID读取进程内存,大小和基址,它可以简单地读取数据(或在其自己的地址空间的mmap区域)

编辑::显然,你不能没有一个打开的/ proc/{} PID/MEM之前的ptrace(),所以这基本是毫无价值的。


在大多数* nixes,ptrace(2)允许附加到一个进程并读取它的内存。


的ptrace的方法不能在OSX工作,你需要更多的魔法有:


你需要Windows下的功能是什么ReadProcessMemory


谷歌搜索“什么是$ OSNAME的ReadProcessMemory”似乎返回全面的结果集。

+0

我在考虑一种比procps或ptrace更加便携/不太暴力的方式,它比IPC更具有调试工具(特别是,只有一个进程可以同时执行一个给定的任务)。我认为我的运气不好。 – michaeljt 2010-08-10 11:50:27