2013-12-20 65 views
4

類似於:Delete all shared memory and semaphores on Linux但是,我想在C中這樣做,而不是用一些腳本。如何刪除未使用的共享內存和信號量?

我的具體問題:在linux + mac中,當我調試一個程序並終止它的進程時,共享資源(內存+信號量)不被釋放。我的程序執行一些客戶端服務器,其中服務器是第一個獲取共享資源的進程。因此,在沒有分離的終止之後,當我重新啓動程序時,當沒有服務器時(因爲資源已被創建並且未被釋放),它假定它是客戶端。

目前,我使用Qt來管理共享資源,但Qt似乎沒有辦法處理這種情況(創建返回的錯誤代碼是資源已經創建)。因此,我正在尋找一個更具體的操作系統的方式來做到這一點。注:Windows沒有此問題,因爲共享資源在終止時自動釋放。

回答

2

檢查man ipcrm

再用ipcrm - 刪除一個消息隊列,信號量設定或共享存儲器ID

服務器是否正常終止?如果是這樣,您可以在退出之前撥shmdt()。 如果它正在崩潰,那就更難了。有一件事是讓它使用shmctl至 查看有多少個進程連接了shm。如果它是0,那麼你顯然不是客戶。

還有一個標誌,您可以設置在shm段IPC_RMID,雖然使用看起來有點模糊。

+0

不,服務器崩潰。我目前在看shmctl,謝謝! – chacham15