【问题标题】:Deleting shared memory segment with shmctl使用 shmctl 删除共享内存段
【发布时间】:2013-03-14 03:49:51
【问题描述】:

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

【问题讨论】:

    标签: c linux shared-memory


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2012-03-20
    • 2013-05-21
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多