2012-03-03 119 views
0

我有一個信號量,我試圖改變它的值,並失敗。在閱讀man頁面後,我瞭解到如果該值小於0並且您使用SETVAL,則會失敗(我沒有初始化它)。但是,當我初始化它時,當我撥打perror()時,我會看到「標識符已移除」。我不確定它是指SETALL還是工會。信號量初始化

我的初始化是這樣的:

union semun argument; 
unsigned short values[1]; 
values[0] = 1; 
argument.array = values; 
int retVal; 

//INITIALIZE our semaphore 
if(retVal = semctl(semId, 0, SETALL, argument) == -1) 
{ 
    perror("semaphore INITIALIZATION failed\n"); 
    exit(1); 
} 

我有我的工會宣佈就像手冊頁和一些其他網站做的,我有semget()後一檢查,以確保它返回一個信號,所以我知道,部分工作正常。如果有人能告訴我我要去哪裏,我會非常感激。

此外,如果有人可以請解釋我的錯誤背後的原因,以便我可以從我的錯誤中學習,這將是最有幫助的。

感謝

更新:它顯然不喜歡== -1,所以我把它改成< 0它工作得很好很奇怪我不知道感謝所有的答覆雖然

+2

是否有你想要/需要的SysV信號燈理由嗎? POSIX信號量通常要好得多(更加安全的API,因爲它們可以在用戶空間中實現,所以速度要快得多),但功能並不那麼強大,並且可能不適用於真正舊的系統。 – 2012-03-03 02:02:27

+0

何時以及如何設置'semId'? – alk 2012-03-03 09:09:36

回答

2

也許你錯過了初始化semId之前致電semctl()

嘗試添加folliwing:

int semId = -1; 

... 

semId = semget(IPC_PRIVATE, 1, IPC_CREAT); 
if (-1 == semId) 
    perror("semget() failed"); 
else { 
/* Your call to semctl() */ 
}