早期的讨论如下:当将信号量递减至零的进程崩溃时,如何恢复信号量?。他们在那里讨论了几种可能的解决方案。
简而言之:
其他可能有帮助的链接:
您似乎在进程间通信方面遇到概念问题。IPC 机制的生命周期不能直接与任何一个进程的生命周期联系在一起,因为这样它可能会从访问它的其他进程中消失。命名信号量在被明确删除之前会一直存在,这是有意为之的。
Linuxsem_overview(7)手册页虽然不是权威规范,但给出了信号量生命周期管理的概要:
sem_open(3) 函数创建一个新的命名信号量或打开一个现有的命名信号量。打开信号量后,可以使用 sem_post(3) 和 sem_wait(3) 对其进行操作。当进程使用完信号量后,可以使用 sem_close(3) 关闭信号量。当所有进程都使用完信号量后,可以使用 sem_unlink(3) 将其从系统中删除。
正如 的文档所sem_unlink()明确的那样,您可以在进程仍然打开信号量时取消链接信号量。此后没有进程可以使用sem_open()该信号量,并且最终当打开该信号量的进程数量降至零时,该信号量将被清除。这是故意与常规文件类似的。
如果确实有一个进程应该负责清理给定的命名信号量,那么您应该确保它就是它sem_unlink()。两个相当好的替代方案是,当您确信需要它的所有其他进程都已打开它时,立即取消链接它,或者注册一个处理取消链接的退出处理程序。如果可行的话,前者可能更好。