18

我对 linux 感到man pages困惑shmctl()。我使用以下命令: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,因为它标记了要删除的段,需要阻塞直到所有其他进程被分离,以确保内存被删除。但这似乎与上述说法相矛盾。我也不知道如何做到这一点(如果应该这样做的话),所以如果是这样的话,你能否解释一下我将如何去做。

4

1 回答 1

20

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

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

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

于 2013-03-24T20:12:38.637 回答