不使用时删除posix共享内存?

use*_*970 12 c linux shared-memory

是否有任何方式,特定于Linux,shm_open()在没有进程使用它们时删除posix共享内存段(获取).即将它们引用计数并让系统在引用变为0时将其删除

几点说明:

  • 如果程序崩溃,建立一个删除它们的atexit处理程序不起作用.

  • 目前,以linux为特定方式,我将pid嵌入到段名中,并尝试通过在外部程序中遍历/ dev/shm来查找未使用的段.这有一个缺点,就是不得不以相当狡猾的方式定期清理它们.

  • 由于程序可以运行多个副本,因此程序在启动时重用的段使用定义良好的名称是不可行的.

Hri*_*iev 7

如果您的程序执行中有一个众所周知的点,即所有需要打开共享内存段的进程都已经这样做了,您可以安全地取消链接。取消链接会从全局命名空间中删除对象,但只要至少有一个进程保持其文件描述符打开,它就会一直存在。如果在那之后发生崩溃,文件描述符将自动关闭并且引用计数减少。一旦未链接的共享内存块的打开描述符不再存在,它就会被删除。

这在以下场景中很有用:一个进程创建一个共享内存块,取消链接,然后分叉。子进程继承文件描述符,可以使用共享内存块与父进程通信。一旦两个进程终止,当两个文件描述符都关闭时,块会自动删除。

未链接时,共享内存块不可用于其他进程打开它。同时,如果使用shm_open()与未链接块相同的名称,则会创建一个新的完全不同的共享内存块。


nos*_*nos 5

不 - 至少在Linux上,内核不包含任何可以执行此操作的内容.某些应用程序可以在某个时刻调用shm_unlink()来摆脱共享内存段.