【问题标题】:shm_open - how to know if I have opened an existing shared memory existingshm_open - 如何知道我是否打开了现有的共享内存
【发布时间】:2014-12-24 19:39:15
【问题描述】:

我有两个问题:

  1. 在使用 shm_open 时,如何知道我是否打开了一个已经存在的共享内存,我正在使用 O_CREATE | O_RDWR。

  2. 我正在使用 shm_open 创建/打开一个具有某些名称的共享内存对象,并使用 mmap 将其映射到进程的虚拟地址空间。如果进程崩溃并且无法清理共享内存,它会一直保留到系统关闭。虽然这与wiki 上提到的内容相矛盾,后者说:“由 shm_open 创建的共享内存是持久的。它会一直保留在系统中,直到被进程明确删除。如果进程崩溃并失败,这有一个缺点要清理共享内存,它将一直保留到系统关闭。为避免此问题,可以使用 mmap 来创建共享内存”。我说的是在 shm_open 中提到的名称的文件,它是在 /dev/shm 中创建的,如果进程在没有清理共享内存(unmap 和 shm_unlink)的情况下崩溃,它仍然存在。我期待,如果任何进程都没有对共享内存的其他引用,并且崩溃的进程是唯一的引用,那么应该清理共享内存对象和文件。

【问题讨论】:

  • 我不明白你的第二个问题。你所说的一切都是完全一致的。你觉得哪里不一致?为什么要清理共享内存?
  • 如果没有更多进程引用共享内存,那么它应该被清理。当我重新启动进程时,我希望创建一个新的共享内存,而不是像以前那样使用。
  • 为什么会这样?您为什么不期待:“由 shm_open 创建的共享内存是持久的。它保留在系统中,直到被进程显式删除。”无论出于何种原因,这种期望似乎都是不合理的。
  • 好吧,我还应该怎么做,有什么替代 shm_open 可以满足我的期望?
  • 你的问题已经回答了:“为了避免这个问题,可以使用 mmap 来创建共享内存

标签: linux memory memory-management shared-memory mmap


【解决方案1】:

我知道这个答案很晚,但我正忙于同一主题。 根据this shm_open manual 使用O_EXCL oflag 来检测共享内存对象是否已经存在。

【讨论】:

  • 没错,但似乎没有办法避免竞争条件。如果 shm_open 由于对象已经存在而失败,那么在您有机会重试之前,它很容易被另一个进程创建。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2013-04-18
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2014-05-20
相关资源
最近更新 更多