2017-04-13 64 views
1

在Linux中,我使用命名信號來控制對不同進程使用的系統資源的訪問。系統重啓後處理被阻塞的已命名信號量

如果系統意外崩潰,可能會發生信號已被獲取但尚未返還。鑑於這種情況,我注意到,即使重啓後信號量仍然保持鎖定狀態。

爲了克服這種情況,是否可以在系統啓動時取消信號量的鏈接,然後再使用一個或多個進程?或者,直到信號量發佈之前,最好是給它一個sem_post()?

順便說一句:

哪裏信號量存儲在內部。我想知道他們爲什麼能在系統重啓後倖存(?在哪裏信號燈內部存儲 ... )在這裏回答

回答

2

你的第二個問題:sem_overview(7)

簡而言之,命名信號量的對象存儲的虛擬文件系統上。按照設計,它們會一直存在,直到系統關閉或直到它們被sem_unlink(3)刪除。

有一點谷歌的研究表明,你看到的問題並不少見。如果系統崩潰,則信號量會按照您所看到的一直存在。

這足以,有些人甚至拿出了完全使用信號燈替代品,例如見一個問題:How do I recover a semaphore when the process that decremented it to zero crashes?

關於你提到的第一個問題,我會並行繪製到寫入文件,並具有進程或系統崩潰時(或者寫入文件並且內容尚未刷新到磁盤)。該文件的狀態和完整性在那個時候是未知的。

將該場景與您的信號量問題進行比較,我相信在系統啓動時刪除流氓信號量是您的最佳選擇。