Мне было интересно, есть ли какой-либо разумно переносимый способ взять существующую неразделяемую память кучи и преобразовать ее в общую память. Вариант использования — это блок памяти, который слишком велик, чтобы я мог копировать его без необходимости (т. е. в новый сегмент разделяемой памяти), и который выделяется подпрограммами, находящимися вне моего контроля. Основной целью является *nix/POSIX, но мне также было бы интересно узнать, можно ли это сделать в Windows.
Есть ли способ преобразовать неразделяемую память кучи в разделяемую память? Основная цель *nix
Ответы (2)
Многие * nixe имеют procfs Plan-9, который позволяет открывать чтение памяти процесса, проверяя /proc/{pid}/mem
Вы сообщаете другому процессу свой pid, размер и базовый адрес, и он может просто прочитать данные (или mmap регион в своем собственном адресном пространстве).
EDIT:: По-видимому, вы не можете открыть /proc/{pid}/mem без предварительного ptrace(), так что это в основном бесполезно.
В большинстве *nix'ов ptrace(2)
позволяет подключиться к процессу и прочитать его память.
Метод ptrace не работает на OSX, там нужно больше магии:
В Windows вам нужна функция ReadProcessMemory
.
Поиск в Google «Что такое ReadProcessMemory для $OSNAME», кажется, возвращает исчерпывающие наборы результатов.
Вы можете попробовать использовать mmap() с флагом MAP_FIXED и адресом вашей нераспределенной памяти (выделенной из кучи). Однако, если вы предоставите mmap() собственный указатель, то он будет ограничен выравниванием и размером в соответствии с размером страницы памяти (может быть запрошен sysconf()) поскольку сопоставление доступно только для всей страницы.