我正在尝试使用POSIX命名信号量进行跨进程同步。我注意到,在进程死亡或退出之后,系统仍然保持着该信号量的开放状态。
是否有任何方法可以使在打开信号量的进程死亡或退出后关闭/释放它呢?
我正在尝试使用POSIX命名信号量进行跨进程同步。我注意到,在进程死亡或退出之后,系统仍然保持着该信号量的开放状态。
是否有任何方法可以使在打开信号量的进程死亡或退出后关闭/释放它呢?
此前的讨论在这里:如何恢复一个信号量当将其减为零的进程崩溃时?他们在那里讨论了几种可能的解决方案。
简而言之:
其他可能有所帮助的链接:
您似乎在处理 进程间 通信时遇到了概念上的问题。IPC 机制的生命周期不能直接绑定到任何一个进程的生命周期,因为这会导致其他访问它的进程失去它。命名信号量的持久性是有意为之的,直到显式删除。
Linux sem_overview(7)
手册页,虽然不是权威规范,但介绍了信号量生命周期管理:
根据sem_open(3) 函数创建一个新的命名信号量或打开一个现有的命名信号量。打开信号量后,可以使用 sem_post(3) 和 sem_wait(3) 对其进行操作。当进程使用完信号量后,可以使用 sem_close(3) 关闭信号量。当所有进程都使用完信号量后,可以使用 sem_unlink(3) 将其从系统中删除。
sem_unlink()
文档的说明,即使进程仍在使用信号量,也可以将其解除链接。此后,没有进程可以sem_open()
该信号量,并且当拥有该信号量的进程数量降至零时,最终将对其进行清理。这故意类似于常规文件。sem_unlink()
它。两个合理的替代方案是在满足需要使用它的所有其他进程已经打开它的条件后立即取消链接,或者注册一个处理取消链接的退出处理程序。如果可行,前者可能更好。