回答
您似乎在與進程間的通信有概念問題。 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文檔中,當進程崩潰或退出時,默認情況下它不會取消鏈接信號量。我只是想知道是否有任何選擇或解決方法來做到這一點。 –