回答
您似乎在与进程间的通信有概念问题。 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()
它。一旦你满意到所有需要它的进程打开它,或者注册一个处理解除链接的退出处理程序,两个合理的好选择就是取消它。如果可行,前者可能更好。
感谢您的回复。是否有可能在一段时间后自动清理自己的时间有限的信号量? –
@ S.X,POSIX信号量没有这种内置的行为,并且在可以想象的范围内,最接近的可能是在固定延迟之后“*无关联”的行为。有几种方法可以编写*程序*来处理这个问题。 –
我喜欢你的评论:“IPC机制的生命周期不能直接与任何一个过程的生命周期相关联”。这对我来说很有意义! – yaobin
先前的讨论在这里:How do I recover a semaphore when the process that decremented it to zero crashes?。他们讨论了几种可能的解决方案
简而言之:
- 号POSIX信号灯不若拥有的进程崩溃释放或通过信号杀死。等待过程将不得不永远等待。只要你坚持信号量,你就无法解决这个问题。
- 您可以使用套接字或文件锁来实现进程间同步,当进程退出时它可以自动释放。我上面发布的问题所有者最终选择了文件锁定。见his answer。在评论区,他发布了一个链接到他的博客讨论这个问题。
其它链接,可以帮助:
- Why is sem_wait() not undone when my program crashes?:它还建议文件锁定。
- Is it possible to use mutex in multiprocessing case on Linux/UNIX ?:他们通过在进程之间共享内存来讨论互斥锁的使用,以实现同步。
- 1. 获取POSIX信号量的名称
- 2. ReleaseSemaphore不释放信号量
- 3. 处理中的自动信号量释放退出
- 4. 收到TERM信号后Java Swing应用程序不会退出
- 5. 用SIGSEGV信号过早退出进程
- 6. 检查POSIX中退出的子进程?
- 7. C,如何在分叉进程上使用POSIX信号量?
- 8. 收到SIGINT信号后退出程序
- 9. Python进程不会退出
- 10. 按名称发送信号给进程
- 11. POSIX信号量之间的儿童和父母进程
- 12. C:信号灯 - 如何在n次回调后释放信号量
- 13. POSIX线程和信号
- 14. Excel进程在COM自动化后不会退出
- 15. 已命名和未命名的posix信号量
- 16. 名称DS会在内容不会退出尝试捕捉
- 17. POSIX线程和退出线程
- 18. boost进程间向量不会释放共享内存
- 19. POSIX信号量的奇怪问题
- 20. 当杀死进程时,linux是否释放了自旋锁/信号量?
- 21. 信号11,iphone应用程序退出
- 22. 在等待信号量时,如何在接收到SIGTERM后正常退出python进程?
- 23. POSIX线程退出而持有互斥
- 24. 即使退出函数后,.NET内存也不能释放
- 25. 来自PySide中子进程的已退出信号
- 26. KILL信号是否立即退出进程?
- 27. 多进程守护进程不会终止在父进程退出
- 28. 如何让我的程序在进入退出后退出
- 29. 在Erlang进程环初始过程不会退出
- 30. Java进程不退出
请给我们一个例子,重现您的问题。截至目前,很难确定究竟是什么原因导致了这个问题。 – fuz
[sem_overview man page](http://linux.die.net/man/7/sem_overview)说:“POSIX命名的信号量具有内核持久性:如果不通过sem_unlink(3)去除,信号量将存在,直到系统被关闭“。如果这没有帮助,那么请澄清你的问题。 – kaylum
我明白,从POSIX文档中,当进程崩溃或退出时,默认情况下它不会取消链接信号量。我只是想知道是否有任何选择或解决方法来做到这一点。 –