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

S.X*_*S.X 6 c linux posix semaphore ipc

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

在进程(打开它)死亡或退出后是否有办法使其关闭/释放?

yao*_*bin 6

早期的讨论如下:当将信号量递减至零的进程崩溃时,如何恢复信号量?。他们在那里讨论了几种可能的解决方案。

简而言之:

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

其他可能有帮助的链接:


Joh*_*ger 4

您似乎在进程间通信方面遇到概念问题。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()。两个相当好的替代方案是,当您确信需要它的所有其他进程都已打开它时,立即取消链接它,或者注册一个处理取消链接的退出处理程序。如果可行的话,前者可能更好。