2016-02-27 4 views
4

Я создаю, записываю и читаю из общего сегмента в Linux, используя функции ftok/shmget/shmat/shmdt.Какова продолжительность жизни разделяемой памяти в Linux

Если я напишу сегменту в одной программе, которая затем выйдет, а затем прочитает сегмент из другой программы позже, я с удивлением обнаруживаю, что данные все еще там.

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

Могу ли я полагаться на это поведение? Или это аналогично продолжению использования указателя после его бесплатного()?

+0

Освобождение сегмента и замена данных - это две разные вещи. Освобождение не обязательно означает, что старые данные были заменены. Пока сегмент не будет переписан каким-либо другим процессом, он будет иметь данные, которые он изначально имел, но для других программ это мусор. –

+0

Отсоединение (shmdt) не разрушает сегмент разделяемой памяти. Для этого вам нужно будет сделать shmctl(), указав IPC_RMID как «cmd». Но обратите внимание, что страница man (в Linux) указывает, что идентификатор сегмента разделяемой памяти не будет уничтожен до тех пор, пока все процессы не отсоединится (shmdt) от него. – TonyB

ответ

4

Общая область памяти сохраняется до тех пор, пока она не будет удалена с помощью shmctl(shmid,IPC_RMID,...) [или перезагрузки системы]. Это вступит в силу после каждого процесса shmdt [или завершено].

Семантика очень похожа на файл. shmat - это как open. shmdt как close и [выше] shmctl как unlink.

Если вы закрываете файл, вы хотите, чтобы он сохранялся до тех пор, пока не будет удален, не так ли? Таким образом, сегменты разделяемой памяти работают аналогично

0

shmdt только отделяет память, никакая стирание/перезапись не выполняется в сегменте данных. До тех пор, пока некоторые другие карты процессов и не будут использовать их, данные будут сохраняться.

Кроме того, вы должны использовать более новый, совместимый с POSIX mmap.

+1

Сегменты общей памяти имеют как минимум срок службы ядра, и в целом они исчезли при перезагрузке. Это означает, что вы должны явно удалить их (IPC_RMID-операция semctl). Вы можете думать о них как о временных файлах *. –

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