【问题标题】:semaphore initialization信号量初始化
【发布时间】:2012-03-03 01:16:54
【问题描述】:

我有一个信号量,我试图改变它的值,但它失败了。在阅读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,它工作得很好,真的很奇怪我不知道感谢所有的回复

【问题讨论】:

  • 您是否有理由想要/需要 SysV 信号量? POSIX 信号量通常要好得多(更清晰的 API,而且速度更快,因为它们可以在用户空间中实现),但没有那么强大,并且可能在真正的旧系统上不可用。
  • 您何时以及如何设置semId

标签: c synchronization semaphore process-control


【解决方案1】:

您可能错过了在调用semctl() 之前初始化semId

尝试添加以下内容:

int semId = -1;

...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多