2012-03-03 69 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() */ 
}