使用shmctl删除共享内存段

使用shmctl删除共享内存段,c,linux,shared-memory,C,Linux,Shared Memory,我被shmctl()的linux手册页弄糊涂了。我使用以下命令:shmctl(id,IPC\u RMID,0)删除共享段。手册页似乎在内存寿命方面自相矛盾 国家: IPC\u RMID 标记要销毁的段。只有在最后一个进程将其分离后(即,当 关联结构shmid_ds的shm_natch成员为零)。这个 调用方必须是所有者或创建者,或者具有特权。如果是一段 已标记为销毁,然后是(非标准)SHM_DEST标志 检索到关联数据结构中shm_perm.mode字段的 将通过IPC设置状态 如果我是正确的,

我被
shmctl()
的linux
手册页弄糊涂了。我使用以下命令:
shmctl(id,IPC\u RMID,0)
删除共享段。
手册页
似乎在内存寿命方面自相矛盾

国家:

IPC\u RMID

标记要销毁的段。只有在最后一个进程将其分离后(即,当 关联结构shmid_ds的shm_natch成员为零)。这个 调用方必须是所有者或创建者,或者具有特权。如果是一段 已标记为销毁,然后是(非标准)SHM_DEST标志 检索到关联数据结构中shm_perm.mode字段的 将通过IPC设置状态

如果我是正确的,我相信这意味着如果您有两个进程都连接到共享内存,(让我们称它们为
Process1
Process2
),那么
Process1
可以创建共享内存、连接、分离、销毁共享内存,并最终终止。然后,在
Process2
也分离之前,内存仍将存在

这是正确的吗

其次,
手册页中的这句话是什么意思

调用者必须确保一个段最终被销毁; 否则,在中出错的页将保留在内存或 交换


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

你的第一个推理是正确的。共享段将一直存在,直到这两个段都被标记为
IPC\u RMID
,最后一个进程分离

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


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

您是否了解此问题?