Я смущен Linux man pages
для shmctl()
. Я использую следующую команду: shmctl (id , IPC_RMID , 0)
для удаления общего сегмента. Кажется, что man pages
противоречит самой жизни памяти.Удаление сегмента разделяемой памяти с помощью shmctl
man pages состояние:
IPC_RMID
Марк сегмент будет уничтожен. Сегмент будет фактически уничтожен только после того, как последний процесс отделит его (то есть, когда элемент shm_nattch shm_nattch ассоциированной структуры shmid_ds равен нулю). Вызывающий абонент должен быть владельцем или создателем или иметь привилегию. Если сегмент был помечен для уничтожения, то будет установлен флаг (нестандартный) SHM_DEST поля shm_perm.mode в связанной структуре данных, полученной по IPC_STAT.
Если я прав, то я считаю, что это означает, что если у вас есть два процесса, которые и крепят к разделяемой памяти (Назовём их Process1
и Process2
), Process1
может создать общую память, прикрепить к нему, отрывать, уничтожить общий памяти и в конечном итоге прекратить работу. Тогда память будет существовать до тех пор, пока Process2
также не отсоединится.
Это правильно?
Во-вторых, то, что делает это заявление в man pages
среднее:
Вызывающий должен гарантировать, что сегмент, в конечном счете разрушен; в противном случае его страницы, которые были сбойны, останутся в памяти или swap.
Это создает впечатление, что Process1
, так как он ознаменовал сегмент для удаления, необходимо будет блокировать, пока все другие процессы не отделены, чтобы обеспечить память будет удален. Но это, похоже, противоречит сказанному выше. Я также не знаю, как это будет сделано (если это предполагается сделать), так что, если это так, не могли бы вы также объяснить, как я буду это делать.