【发布时间】:2014-12-24 19:39:15
【问题描述】:
我有两个问题:
在使用 shm_open 时,如何知道我是否打开了一个已经存在的共享内存,我正在使用 O_CREATE | O_RDWR。
我正在使用 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