Удаление сегмента разделяемой памяти с помощью shmctl

Я смущен man pages linux man pages для shmctl(). Я использую следующую команду: shmctl (id, IPC_RMID, 0) чтобы удалить общий сегмент. man pages похоже, противоречат самой жизни памяти.

На страницах руководства указано:

IPC_RMID

Отметьте сегмент, который нужно уничтожить. Сегмент будет фактически уничтожен только после того, как последний процесс отделит его (т.е. Когда член shm_nattch связанной структуры shmid_ds равен нулю). Вызывающий должен быть владельцем или создателем или быть привилегированным. Если сегмент отмечен для уничтожения, то будет установлен флаг (нестандартный) SHM_DEST поля shm_perm.mode в связанной структуре данных, полученной IPC_STAT.

Если я прав, я считаю, что это означает, что если у вас есть два процесса, которые оба подключаются к общей памяти (Позволяет называть их Process1 и Process2), Process1 может создавать разделяемую память, присоединять, отсоединять, уничтожать разделяемую память и в конечном итоге прекращать работу. Затем память будет существовать до Process2 пор, пока Process2 также не отсоединится.

Это верно?

Во-вторых, что означает это утверждение на man pages руководства:

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

Это делает его похожим на Process1, поскольку он помечен сегментом для удаления, ему нужно будет блокировать до тех пор, пока все остальные процессы не будут отсоединены, чтобы обеспечить удаление памяти. Но это, похоже, противоречит сказанному выше. Я также не знаю, как это будет сделано (если это предполагается сделать), так что, если это так, не могли бы вы также объяснить, как я буду это делать.

Ответ 1

Ваши первые рассуждения верны. Общий сегмент будет существовать до тех пор, пока оба: он будет отмечен IPC_RMID и последний процесс отсоединяется.

Цель второго фрагмента - напомнить вам, что в решении, использующем разделяемую память, вам нужно, чтобы какой-то процесс маркировал его для уничтожения или он останется в памяти/своп навсегда. Возможно, неплохо было бы использовать IPC_RMID сразу после создания сегмента.

Если вы не уверены, что успешно освободили память, вы можете использовать программу ipcs для отображения остальных сегментов.