2011-11-09 69 views
0
#include <semaphore.h> 

sem_t* x; 

int main() 
{ 
    x = sem_open("x", O_CREAT, 0, 0);; 
    sem_wait(x); sem_wait(x); sem_wait(x); 
    std::cout << "\ndone\n"; 
} 

此代碼甚至不應該通過第一sem_wait()但我的系統上它達到main()末。我已閱讀的所有內容(如herehere)都表示,雖然Mac OS X不支持sem_init(),但確實支持sem_open()。但是,如上所述使用sem_open()尚未解決問題。我正在運行OS X 10.5.7。C++的Mac OS X semaphore.h中:麻煩`sem_open()`和`sem_wait()`

+0

您需要檢查'sem_open'的返回值。如果它是'SEM_FAILED',你需要看'errno'。 –

回答

3

嘗試把sem_unlink("x");之前sem_open(),我敢肯定這不是你的第一次嘗試。 0的模式不會讓你用它做很多事情,除非你刪除它。此外,請檢查您的電話是否有錯誤,如果不能解決,至少需要修改您的問題。

+0

'sem_unlink(「x」);'做到了。這是否意味着在調用過程結束後,一個已命名的信號量會一直存在,除非它明確地被解除鏈接,從而導致'O_CREAT'由於信號量已經存在而失敗?但實際上我還是不太清楚這將如何解釋這種行爲。 –

+0

是的,它一直存在。問題不在於'O_CREAT'標誌,如果它不存在,應該創建信號量(不像'O_EXCL',如果它存在,它會失敗)。問題是信號量存在並限制所有類型的訪問(模式爲0)。這就是爲什麼你需要首先解除鏈接。 –

1

0到sem_open的權限意味着沒有人可以訪問信號量。你真的應該添加適當的錯誤檢查 - 它會告訴你哪個功能失敗和方式。

+0

如果我想讓調用進程不受限制地訪問,應該將其設置爲什麼模式? –

+1

0700,我相信。 –

+0

所以我:)不知道,但它是關於調用*進程*,但儘可能接近你可以得到。 –