POSIX名称信号量在进程退出后不会释放

时间:2016-01-13 00:32:28

标签: c linux posix ipc semaphore

我正在尝试使用POSIX命名信号量进行跨进程同步。我注意到在进程死亡或退出后,系统仍然打开信号量。

无论如何在进程(打开它)死亡或退出后关闭/释放它?

2 个答案:

答案 0 :(得分:2)

您似乎对进程间通信存在概念性问题。 IPC机制的生命周期不能直接与任何一个进程的生命周期联系在一起,因为它可能会从访问它的其他进程中消失。在明确删除之前,命名信号量一直存在是故意的。

The Linux sem_overview(7) manual page虽然不是权威规范,却给信号量生命周期管理带来了破坏:

  

sem_open(3)函数创建一个新的命名信号量或打开一个现有的命名信号量。打开信号量后,可以使用sem_post(3)和sem_wait(3)进行操作。当进程使用完信号量后,它可以使用sem_close(3)来关闭信号量。当所有进程使用信号量完成后,可以使用sem_unlink(3)将其从系统中删除。

正如sem_unlink()的文档所表明的那样,您可以取消链接信号量,同时进程仍然打开它。此后,任何进程都不能sem_open()该信号量,并且当它打开的进程数降为零时,最终它将被清除。这有意类似于常规文件。

如果确实有一个进程负责清理给定的命名信号量,那么你应该确定它sem_unlink()。只要您确信需要它的所有其他进程已打开它,或者注册处理取消链接的退出处理程序,两个相当不错的替代方法是取消链接。如果可行,前者可能更好。

答案 1 :(得分:1)

此前的讨论如下:How do I recover a semaphore when the process that decremented it to zero crashes?。他们在那里讨论了几种可能的解决方案。

简而言之:

  • 否。如果拥有进程崩溃或被信号杀死,则不会释放POSIX信号量。等待过程必须永远等待。只要你坚持使用信号量,你就无法解决这个问题。
  • 您可以使用套接字或文件锁来实现进程间同步,这可以在进程退出时自动释放。我上面发布的问题所有者最终选择了文件锁。见his answer。在评论区域,他发布了一个链接到他的博客,讨论了这个问题。

其他可能有用的链接: