2016-01-13 118 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。在評論區,他發佈了一個鏈接到他的博客討論這個問題。

其它鏈接,可以幫助: