【问题标题】:Cleanly destroy a System V shared memory segment彻底销毁 System V 共享内存段
【发布时间】:2012-12-06 00:51:28
【问题描述】:

我正在使用shmgetshmatshmctl分别获取和创建一个共享内存段,将其附加到进程地址空间并删除它。

我想知道进程是否仍然可以使用共享内存段,即使它已被分离并要求使用

shmctl(id, IPC_RMID, ...)

在一个过程中。

我无法从手册页获取信息:

IPC_RMID 标记要销毁的段。该段仅在最后一个进程将其分离后才会真正被销毁(即,当关联结构shmid_dsshm_nattch 成员为零时)。调用者必须是所有者或创建者,或者具有特权。如果段已被标记为销毁,则shm_perm.mode 的(非标准)SHM_DEST 标志 将设置IPC_STAT 检索到的关联数据结构中的字段。

【问题讨论】:

  • 即使您仍然可以使用它,您怎么知道其他进程在您使用时不会分离(并因此破坏)该段?
  • @FrédéricHamidi 我不明白你的评论。这是否意味着答案是肯定的?你能解释一下吗?
  • 如果请求销毁的进程之后没有分离该段,答案是肯定的,但从你的问题看来你已经知道了。所以我假设你想知道在请求销毁和分离之后是否仍然可以使用shmat() 映射的地址。因此,我的评论。
  • 好的,我明白了。我将问题编辑得更清楚。
  • 我不明白您为什么不理解手册页中引用的材料段落。它是这样写的,大概是为了准确回答你的问题。需要注意的关键短语是:该段只有在最后一个进程分离它之后才会真正被销毁 所以,是的,其他进程仍然可以使用共享内存段,直到它们也分离它。请注意,POSIX 定义没有这种措辞。请参阅 Linux shmctl(2) 手册页中的 NOTES 部分!

标签: c linux


【解决方案1】:

在 Linux 上,可以附加共享内存段,即使它已被标记为删除。但是,POSIX.1-2001 没有指定这种行为,并且许多其他实现不支持它。

【讨论】:

  • 另见stackoverflow.com/a/42479369/2732969,其中谈到了一些其他操作系统(FreeBSD 11+、OpenBSD 5.1+),它们实现了“在保持活动状态时附加到已删除的段”行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2011-01-14
  • 2012-01-06
  • 2012-07-15
  • 1970-01-01
相关资源
最近更新 更多