【发布时间】:2019-07-24 18:03:11
【问题描述】:
根据我的观察,如果我在不删除共享内存段的情况下终止进程,则该共享内存段将留在/dev/shm/xxxx 中,甚至没有其他进程正在使用它。 是否意味着内存泄漏?(并且在我重新启动机器后它会消失)为什么linux没有提供一种机制来维护共享内存的引用计数,然后系统可以在没有时删除它进程正在使用它。
由于进程可能崩溃,或者我只是未能捕获一些异常......无论如何,当进程异常终止时,我很有可能无法删除该共享内存段。
我的用例:我正在运行多个共享同一内存段进行通信的工作进程。并且没有主节点来协调事情。策略是最后一个退出节点将关闭共享内存段。
顺便说一句,我使用的是boost::interprocess 而不是系统级别的shm_open,但我认为它们的行为应该是相同的。
【问题讨论】:
-
你怎么知道哪个是最后一个出口节点?
-
通常,您想知道哪个节点是第一个启动的。该节点应该清理所有遗留的混乱,然后创建一个新的共享内存段。
-
可以得到你描述的行为:创建并映射一个共享内存对象后,使用
shm_unlink将其与名称解除关联。它将继续存在直到最后一个引用被关闭,例如当最后一个映射它的进程取消映射它时。 -
@user3386109 可能是通过文件锁定或其他方式......因为我可以知道有多少进程正在打开一个文件,即使进程崩溃,该文件的引用计数也会减少。
标签: c linux multiprocessing shared-memory