使用shmctl删除共享内存段

时间:2013-03-24 17:30:21

标签: c linux shared-memory

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

man pages州:

  

IPC_RMID

     

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

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

这是对的吗?

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

  

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

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

1 个答案:

答案 0 :(得分:18)

你的第一个推理是正确的。共享段将存在,直到两者:它标记为IPC_RMID并且最后一个进程分离。

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

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