使用shmctl删除共享内存段

MrH*_*hma 15 c linux shared-memory

我对Linux的困惑man pagesshmctl().我使用以下命令:shmctl (id , IPC_RMID , 0)删除共享段.这man pages似乎与记忆的生命周期相矛盾.

手册页指出:

IPC_RMID

标记要销毁的细分.该段仅在最后一个进程分离之后才被实际销毁(即,当关联结构shmid_ds的shm_nattch成员为零时).呼叫者必须是所有者或创建者,或具有特权.如果段已被标记为销毁,则将设置IPC_STAT检索的关联数据结构中的shm_perm.mode字段的(非标准)SHM_DEST标志.

如果我是正确的,我相信这意味着如果你有两个附加到共享内存中的两个过程,(让我们称他们为Process1Process2),Process1可以创建共享内存,连接,分离,破坏了共享内存,并最终终止.然后内存仍然存在,直到Process2分离.

它是否正确?

其次,这句话的man pages意思是:

调用者必须确保段最终被销毁; 否则其故障的页面将保留在内存或交换中.

这似乎是Process1因为它标记了要删除的段,因此需要阻塞直到所有其他进程都被分离,以确保删除内存.但这似乎与上述说法相矛盾.我也不知道如何做到这一点(如果应该这样做的话),所以如果是这样的话,你能解释一下我会怎么做.

zch*_*zch 18

你的第一个推理是正确的.共享段将一直存在,直到它们:标记为IPC_RMID和最后一个进程分离.

第二个片段的目的是提醒您,在使用共享内存的解决方案中,您需要有一些进程将其标记为销毁,否则它将永久保留在内存/交换中.IPC_RMID创建段后立即使用可能是个好主意.

如果您不确定是否已成功释放内存,则可以使用ipcs程序列出剩余的段.