我正在尝试使用POSIX命名信号量进行跨进程同步。我注意到在进程死亡或退出后,系统仍然打开信号量。
无论如何在进程(打开它)死亡或退出后关闭/释放它?
答案 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?。他们在那里讨论了几种可能的解决方案。
简而言之:
其他可能有用的链接: