2012-03-09 44 views
2

嘗試打開信號量時,sem_open失敗。 errno是22(),該錯誤描述爲「無效參數」。我已經檢查了名稱的格式(我認爲是正確的)以及標誌(O_CREAT和O_EXCL似乎很難搞亂,我沒有看到什麼?)OSX信號量:sem_open中的參數無效

平臺是OS X 10.7。I寧願使用一個無名信號量,但OS doesn't support sem_init

int name_counter = 0; 

// In order to create a unique semaphore, we iterate until we find a name that 
// does not already exist. 
do { 
    char name[48] = {0}; 
    sprintf(name, "xyz_sem_%d", name_counter++); 
    job_semaphore = sem_open(name, O_CREAT | O_EXCL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, 0); 
} while(errno == EEXIST); 

if(0 != errno) 
    perror("Error opening xyz semaphore"); 
assert(0 == errno); 

我都試過

sem_open(name, O_CREAT | O_EXCL); 

sem_open(name, O_CREAT | O_EXCL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, 0); 

打開信號量,但每個都得到相同的結果。我錯過了什麼?

編輯:上面的版本只有兩個參數是錯誤的 - 手冊頁說,包括O_CREAT時,您必須提供所有4個參數。

EDIT2:errno僅在函數返回錯誤代碼時有效。在這種情況下,我應該只在sem_open返回SEM_FAILED時才查看errno。我沒有這樣做,並且在完美的信號量返回時正在檢查errno。問題解決了。

+1

@leebaker:你有沒有找到解決你的問題? – Robin 2013-03-19 04:59:38

回答

0

在嘗試sem_open之前,請嘗試sem_unlink()

0

名稱應該帶有前導斜槓。嘗試在名稱前加上「/」。 即。 sprintf(名稱,「/ xyz_sem_%d」,name_counter ++);

+0

它在哪裏記載了信號量名稱應該以斜槓開頭?這是一個慣例還是一個硬性要求? – 2015-10-08 13:02:29

+0

沒有OSX方便,Freebsd,'man sem_open'說....「這個實現對名稱的值有嚴格的要求:它必須以斜槓('/')開頭並且不包含其他斜槓字符 」 ,在linux上man'sem_overview'中的相同類型的東西,所以對於OSX – harryr 2015-11-05 03:51:45

+0

iOS或Mac OS也是如此,這似乎沒有這個要求。我使用的名稱以alpha開頭,包含字母數字和斜線,並且它們工作正常。 – 2015-11-05 14:40:54