我最近在使用OS X時遇到了這個問題。我找到的解決方案是取消共享內存然後重新創建它。你也可以嘗試重新啓動,因爲至少對於Linux而言,POSIX風格的信號量是內核持久化的。
POSIX命名信號量具有內核持久性:如果不通過sem_unlink(3)刪除,信號量將存在,直到系統關閉。
當您嘗試通過爲模式提供不正確的權限來創建共享內存,或者可能完全忽略該模式時,會出現問題。然後,當您糾正問題並嘗試打開信號燈時,它仍然使用持續存在的原始信號量。
因此,嘗試這樣做:
#define SHAREDSEM "/sharedSem"
sem_unlink(SHAREDSEM);
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0777, 1);
如果這是你想要創建的信號量,那麼你可以在O_EXCL
選項,這使得如果信號燈已經存在,它不能選擇性地添加的唯一地方。這至少對於調試來說很有用,看看這是否是你所面臨的問題。
爲此嘗試:
#define SHAREDSEM "/sharedSem"
sem_unlink(SHAREDSEM);
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT | O_EXCL, 0777, 1);
注意,在這些例子中我將權限設置爲0777,以便它是供大家使用。這對調試很有用。在最後的實施中,請記住將其設置回您所需的適當權限。
user1305858,你有沒有找到解決辦法? – Robin 2013-03-19 06:24:02