我有一个信号量,我试图改变它的值,但它失败了。在阅读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
并且它工作正常非常奇怪我不知道感谢所有的回复
答案 0 :(得分:2)
可能您在致电semId
之前错过了初始化semctl()
。
尝试添加以下内容:
int semId = -1;
...
semId = semget(IPC_PRIVATE, 1, IPC_CREAT);
if (-1 == semId)
perror("semget() failed");
else {
/* Your call to semctl() */
}