Я смущен 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
, поскольку он помечен сегментом для удаления, ему нужно будет блокировать до тех пор, пока все остальные процессы не будут отсоединены, чтобы обеспечить удаление памяти. Но это, похоже, противоречит сказанному выше. Я также не знаю, как это будет сделано (если это предполагается сделать), так что, если это так, не могли бы вы также объяснить, как я буду это делать.