【发布时间】:2012-12-06 00:51:28
【问题描述】:
我正在使用shmget、shmat和shmctl分别获取和创建一个共享内存段,将其附加到进程地址空间并删除它。
我想知道进程是否仍然可以使用共享内存段,即使它已被分离并要求使用
shmctl(id, IPC_RMID, ...)
在一个过程中。
我无法从手册页获取信息:
IPC_RMID标记要销毁的段。该段仅在最后一个进程将其分离后才会真正被销毁(即,当关联结构shmid_ds的shm_nattch成员为零时)。调用者必须是所有者或创建者,或者具有特权。如果段已被标记为销毁,则shm_perm.mode的(非标准)SHM_DEST标志 将设置IPC_STAT检索到的关联数据结构中的字段。
【问题讨论】:
-
即使您仍然可以使用它,您怎么知道其他进程在您使用时不会分离(并因此破坏)该段?
-
@FrédéricHamidi 我不明白你的评论。这是否意味着答案是肯定的?你能解释一下吗?
-
如果请求销毁的进程之后没有分离该段,答案是肯定的,但从你的问题看来你已经知道了。所以我假设你想知道在请求销毁和分离之后是否仍然可以使用
shmat()映射的地址。因此,我的评论。 -
好的,我明白了。我将问题编辑得更清楚。
-
我不明白您为什么不理解手册页中引用的材料段落。它是这样写的,大概是为了准确回答你的问题。需要注意的关键短语是:该段只有在最后一个进程分离它之后才会真正被销毁 所以,是的,其他进程仍然可以使用共享内存段,直到它们也分离它。请注意,POSIX 定义没有这种措辞。请参阅 Linux shmctl(2) 手册页中的 NOTES 部分!