2015-03-28 3 views
1

Я работаю над проектом на C, который использует общую память для IPC в системе Linux. Тем не менее, я немного запутался в управлении памятью в этих сегментах. Я использую POSIX API для этого проекта.Управление памятью для сопоставленных данных в общих сегментах памяти

Я понимаю, как создавать разделяемые сегменты, и чтобы они сохранялись до перезагрузки, если вы не смогли правильно удалить их с помощью shm_unlink(). Кроме того, я понимаю, как сделать фактическое отображение & unmapping с mmap и munmap соответственно. Однако использование этих операций и то, как они влияют на сохраненные данные в этих разделяемых сегментах, меня сбивает с толку.

Вот что я пытаюсь правильно понять:

Допустим, я создать сегмент, используя shm_open() с O_CREAT флагом. Это дает мне файловый дескриптор, который я назвал msfd в приведенном ниже примере. Теперь у меня есть структуру, которая мне карту в это адресное пространство следующим:

mystruct* ms = (mystruct*)mmap(NULL, sizeof(mystruct), PROT_READ | PROT_WRITE, MAP_SHARED, msfd, 0); 
//set the elements of the struct here using ms->element = X as usual 

Часть 1) Вот где мои спутанность существа. Допустим, что этот процесс теперь доступен для доступа к этому местоположению, поскольку он просто устанавливает данные для другого процесса для чтения. Я все еще звоню munmap()?

Я хочу, чтобы другой процесс все еще имел доступ ко всем этим данным, которые задал текущий процесс. Обычно вы не вызываете free() на указатель malloc 'до тех пор, пока его использование больше не понадобится навсегда. Тем не менее, я понимаю, что, когда этот процесс выходит из unmapping, это происходит автоматически. Сохраняются ли данные внутри сегмента или же этот сегмент просто зарезервирован с его выделенным размером и именем?

часть 2) Теперь мы находимся в процессе выполнения другого приложения, которому необходимо получить доступ и прочитать его из этого общего сегмента. Я понимаю, что теперь мы открываем этот сегмент с помощью shm_open(), а затем выполняем ту же операцию сопоставления с mmap(). Теперь у нас есть доступ к структуре в этом сегменте. Когда мы вызываем munmap() из этого процесса (НЕ тот, который создал данные), он «отключает» нас от этого указателя, однако данные все еще доступны. Означает ли это, что процесс 1 (создатель) имеет NOT под названием munmap()?

ответ

2

ли данные сохранялись внутри сегмента,

Да.

этот сегмент просто зарезервирован с его выделенным размером и именем?

Также есть.

Означает ли это, что процесс 1 (создатель) НЕ вызвал munmap()?

No.

Общая память создается через shm_create() (как взято из доступной памяти ОС), и с этого момента она несет в себе содержимое, которое было записано, до тех пор, пока оно не будет возвращено ОС через shm_unlink().

shm_create() и shm_open() действует система, ориентированная, с точки зрения (общей) памяти, являющейся системным (а не процессом) конкретным ресурсом.

mmap() и unmap() действовать ориентированным на процесс, то есть отображать и деактивировать разделяемую память системных ресурсов в/из адресного пространства процесса.

+0

Спасибо за ясность! – JNYRanger