我对man pages
的linux shmctl()
感到困惑。我使用以下命令:shmctl (id , IPC_RMID , 0)
删除共享段。 man pages
似乎与记忆的生命周期相矛盾。
IPC_RMID
标记要销毁的细分。该段仅在最后一个进程分离之后才被实际销毁(即,当 相关结构shmid_ds的shm_nattch成员为零)。该 呼叫者必须是所有者或创建者,或具有特权。如果是一个细分 已被标记为销毁,然后是(非标准)SHM_DEST标志 检索到的关联数据结构中的shm_perm.mode字段 将设置IPC_STAT。
如果我是正确的,我相信这意味着如果你有两个进程都连接到共享内存,(让我们称之为Process1
和Process2
),Process1
可以创建共享内存,附加,分离,破坏共享内存,最终终止。然后内存仍然存在,直到Process2
也分离。
这是对的吗?
其次,man pages
中的这句话是什么意思:
调用者必须确保段最终被销毁; 否则其出现故障的页面将保留在内存或 交换。
这使它看起来像Process1
,因为它标记了要删除的段,需要阻塞,直到所有其他进程都被分离,以确保删除内存。但这似乎与上述说法相矛盾。我也不知道如何做到这一点(如果应该这样做的话),所以如果是这样的话,你能解释一下我会怎么做。
答案 0 :(得分:18)
你的第一个推理是正确的。共享段将存在,直到两者:它标记为IPC_RMID
并且最后一个进程分离。
第二个片段的目的是提醒您,在使用共享内存的解决方案中,您需要将某个进程标记为要进行销毁,否则它将永久保留在内存/交换中。在创建分段后立即使用IPC_RMID
可能是个好主意。
如果您不确定是否已成功释放内存,可以使用ipcs
程序列出剩余的段。