2016-04-19 3 views
4

Я начал играть с mmap. Я пытаюсь создать примерное рабочее пространство, которое затем будет распространено на реальный случай.Доступ к памяти памяти из другого процесса

Это то, что я хочу добиться:

ПРОЦЕСС 1:

  • ММАП файл (на самом деле это устройство, но это нормально, чтобы генерировать пример с текстовым файлом)

ПРОЦЕСС 2: (не вывихнут из процесса 1, только независимый процесс)

  • прочитайте меня Мори сопоставляются процессом 1
  • изменить некоторые биты
  • записать его в новый файл

Я прочитал несколько примеров и документации, но я до сих пор не нашли, как достичь этого. Что мне не хватает:

  • Как обрабатывать 2 доступ к памяти, отображаемой процессом 1, ничего не зная о открывшемся файле?
  • Как разместить содержимое mmap в новом файле? Я полагаю, я должен ftruncate нового файла, ММАПА этого файл и тетср содержания карты процесс 1 память для обработки 2 карты памяти (то msync)

Side информации, у меня есть очередь сообщений открыто между двумя процессами , поэтому они могут совместно использовать некоторые сообщения (например, адрес/размер памяти, ...).

Любые подсказки?

Заранее благодарен!

MIX

+0

ММАП не является формой IPC. возможно, вы хотите shmem? – xaxxon

ответ

2

Этот ответ считает вы пытаетесь сделать этот материал на Linux/Unix.

Как обрабатывать 2 доступ к памяти, отображаемой процессом 1, ничего не зная о открывшемся файле?

Процесс 1 переходит в mmap [1] флаг MAP_SHARED.

Вы можете:

  • A) Доля дескриптора файла, используя сокеты Unix [2].
  • B) Отправить имя файла, используя то, о чем вы упоминали в конце свое сообщение.

Процесс 2 открывает mmap с флагом MAP_SHARED. Изменения для mmaped памяти в Process 1 будут видны для процесса 2.Если вам нужно тонкое управление, когда показываются изменения процесса 1 в процессе 2, вы должны управлять им с помощью msync [3]

Как разместить содержимое mmap в новом файле? Я полагаю, я должен ftruncate нового файла, MMAP этого файл и тетср содержания процесса отображения 1 память для обработки 2 карты памяти (то 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

+0

Спасибо за ваш ответ. Я попытаюсь передать дескриптор файла через очередь сообщений и посмотреть, все ли работает. Полагаю, мне тоже нужно передать размер памяти. О memcpy/msync vs write, я пойду для первого, так как в реальном приложении мне придется сделать несколько небольших записей в том же mmapped файле вывода и msync в конце. Я думаю, что это будет лучше работать с memcpy. –

+0

Будьте осторожны, вы не можете передавать файловые дескрипторы через очередь сообщений. Это не сработает. Вы должны использовать сокеты домена unix (это делает черную магию назначать внутренний материал, прикрепленный к файловому дескриптору в процессе приема). –

+0

Конечно, я не читал ваш ответ внимательно об этом. Поскольку очередь сообщений уже запущена и запущена, я попробую использовать имя файла. –

Смежные вопросы