2013-02-23 85 views
1

我正在嘗試創建一個可以在進程間共享的簡單信號量。我的主程序調用以下函數來創建一個信號量。信號量權限被拒絕

#define SHAREDSEM "/sharedSem" 
sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0644, 1); 

但是,我收到錯誤「權限被拒絕」。我在Mac OS X上運行此代碼,並且我明白它不支持未命名的信號量。但我很確定sem_open是用於命名信號量的。

我試過使用不同的t_mode沒有成功。

有沒有人遇到過這個問題,可以幫忙嗎?

+0

user1305858,你有沒有找到解決辦法? – Robin 2013-03-19 06:24:02

回答

4

我最近在使用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,以便它是供大家使用。這對調試很有用。在最後的實施中,請記住將其設置回您所需的適當權限。

+0

在Linux上,我看不到使用ipcs的信號量或相關的共享內存。然而重啓清除了問題。舊的IT人羣解決方案。 – teambob 2015-05-05 04:03:51