【问题标题】:shm_unlink in linuxLinux中的shm_unlink
【发布时间】:2020-09-29 12:43:03
【问题描述】:

来自shm_unlink的手册页:

 The operation of shm_unlink() is analogous to unlink(2): it removes a
 memory object name, and, once all processes have unmapped the object,
 de-allocates and destroys the contents of the associated memory
 region.  After a successful shm_unlink(), attempts to shm_open()
 an object with the same name fail (unless O_CREAT was specified,
 in which case a new, distinct object is created).

这句话的作用是由句子指定的

it removes a memory object name, and, once all processes have unmapped the object, de-allocates and destroys the contents of the associated region

那么,这是否意味着当调用shm_unlink 时,将自动对所有进程进行取消映射,然后销毁将发生,或者它仍然存在,并且只要使用此空间的所有进程都取消映射空间(根据他们未来的方便),它会被破坏吗?

上面的描述是手册页的描述有点不足,这可以用上述两种方式解释,因此我怀疑。

【问题讨论】:

  • 进程不会把地毯从脚下拉出来。
  • @IanAbbott 所以在所有进程都取消映射它之后,只有它会被取消分配,对吧?

标签: linux posix shared-memory


【解决方案1】:

罪魁祸首在这里:

[...] 一旦所有进程取消映射对象,就会取消分配并销毁相关区域的内容。

关键字未映射

调用shm_unlink() 只会影响调用进程,不会影响已经映射区域的其他进程。如果其他进程已经将该共享内存区域映射到它们的地址空间,它仍然对它们有效。这与处理文件的方式相同。如果一个进程打开(映射)一个文件,而第二个进程通过unlink 将其删除,则第一个进程仍然能够从映射的内存页中读取文件内容。

如果该区域被多个进程共享,内核将等待所有它们取消映射该区域并关闭文件描述符从shm_open() 获得,只有这样它才会取消分配并销毁相关内存区域的内容。即使shm_unlink() 被调用,内核也必须在每个进程关闭它们的描述符或终止之前等待(此时内核会自动关闭描述符)。

【讨论】:

  • 因此,如果某个进程创建了共享内存,并且该内存被多个其他进程使用,这些进程稍后会调用 shm_unlink(),但第一个进程没有。那么该内存是否仍然处于活动状态或将被释放
  • @AbhayPatil 它仍将处于活动状态。
  • 好吧,我写了一些代码,这反驳了这一点。你能看看他们吗
  • 首先运行pastebin.com/3NiccCRU,然后运行pastebin.com/0ChchFxa,然后运行pastebin.com/RSnyPJ59。第一个创建一个名为OS 的共享内存,第二个和第三个从OS 读取。区别在于第二个不像第三个那样调用 shm_unlink 。在运行第一个之后,您运行第一个,然后您可以根据需要运行第二个,因为它不会调用 unlink。但是如果你运行第三个,那么你就不能运行第二个(错误)。但正如你所说的第一个没有关闭,它仍然存在,但如果是这样,那么第二个应该运行
  • 看看我是不是弄错了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2019-06-05
  • 2012-03-05
相关资源
最近更新 更多