2016-01-13 121 views
1

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

是否有反正在进程(打开它)死亡或退出后关闭/释放?

+0

请给我们一个例子,重现您的问题。截至目前,很难确定究竟是什么原因导致了这个问题。 – fuz

+0

[sem_overview man page](http://linux.die.net/man/7/sem_overview)说:“POSIX命名的信号量具有内核持久性:如果不通过sem_unlink(3)去除,信号量将存在,直到系统被关闭“。如果这没有帮助,那么请澄清你的问题。 – kaylum

+0

我明白,从POSIX文档中,当进程崩溃或退出时,默认情况下它不会取消链接信号量。我只是想知道是否有任何选择或解决方法来做到这一点。 –

回答

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_unlink()它。一旦你满意到所有需要它的进程打开它,或者注册一个处理解除链接的退出处理程序,两个合理的好选择就是取消它。如果可行,前者可能更好。

+0

感谢您的回复。是否有可能在一段时间后自动清理自己的时间有限的信号量? –

+0

@ S.X,POSIX信号量没有这种内置的行为,并且在可以想象的范围内,最接近的可能是在固定延迟之后“*无关联”的行为。有几种方法可以编写*程序*来处理这个问题。 –

+0

我喜欢你的评论:“IPC机制的生命周期不能直接与任何一个过程的生命周期相关联”。这对我来说很有意义! – yaobin

0

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

简而言之:

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

其它链接,可以帮助: