views:

38

answers:

2

I was wondering whether there is any reasonably portable way to take existing, unshared heap memory and to convert it into shared memory. The usage case is a block of memory which is too large for me to want to copy it unnecessarily (i.e. into a new shared memory segment) and which is allocated by routines out of my control. The primary target is *nix/POSIX, but I would also be interested to know if it can be done on Windows.

A: 

You can try using mmap() with MAP_FIXED flag and address of your unshared memory (allocated from heap). However, if you provide mmap() with own pointer then it is constrained to be aligned and sized according to the size of memory page (may be requested by sysconf()) since mapping is only available for the whole page.

Pmod
Re MAP_FIXED, I thought that that unmapped whatever was formerly in the map location, rather than sharing that memory.
michaeljt
A: 

Many *nixe have Plan-9's procfs which allows to open read a process's memory by inspecting /proc/{pid}/mem

You tell the other process your pid, size and the base address and it can simply read the data (or mmap the region in its own address space)

EDIT:: Apparently you can't open /proc/{pid}/mem without a prior ptrace(), so this is basically worthless.


Under most *nixes, ptrace(2) allows to attach to a process and read its memory.


The ptrace method does not work on OSX, you need more magic there:


What you need under Windows is the function ReadProcessMemory .


Googling "What is ReadProcessMemory for $OSNAME" seems to return comprehensive result sets.

Luther Blissett
I was thinking of a more portable/less violent way than procps or ptrace, which are more debugging tools than IPC ones (and in particular, only one process can ptrace a given task at one time). I assume I am out of luck with that.
michaeljt