首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >信号量值初始化为-1?

信号量值初始化为-1?
EN

Stack Overflow用户
提问于 2015-03-13 23:15:58
回答 2查看 1.2K关注 0票数 1

我正在尝试为一些共享内存初始化一个二进制信号量。我不知道为什么我挂在一个信号量得到信号量,并最终发现信号量值是-1,我被困在等待。我不明白的是为什么信号量值开始初始化为-1。任何帮助澄清这一点将不胜感激。

代码语言:javascript
代码运行次数:0
运行
复制
semID = semget(IPC_PRIVATE, 1, S_IRUSR | S_IWUSR); // create sem
int semval = semctl(semID, 1,GETVAL);

printf("After init Semaphore value = %d \n", semval);
printf("sem ID = %d \n", semID);

产出:

代码语言:javascript
代码运行次数:0
运行
复制
 After init semaphore value = -1 
 sem ID = 524304 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-13 23:30:37

你有两个虫子。第一个错误是,和C中一样,semget创建的信号量数组是0索引的;因此,如果您只创建一个信号量,那么使用该semidsemctl的第二个参数应该是0,而不是1。从semctl返回的-1不是信号量的值,而是一个错误指示(您应该找到errno == EINVAL)。

你的第二个bug更微妙。semget说:

创造的时候..。

  • 与集合中的每个信号量关联的数据结构不需要初始化。可以使用带有命令SETVALSETALLSETVAL函数来初始化每个信号量。

(强调我的意思)这意味着,您的代码在第一次创建时不能依赖具有任何特定值的新SysV信号量。你必须这样做:

代码语言:javascript
代码运行次数:0
运行
复制
semID = semget(IPC_PRIVATE, 1, S_IRUSR|S_IWUSR);
if (semID < 0) {
    perror("semget");
    return -1;
}

union semun arg;
arg.val = 0;
if (semctl(semID, 0, SETVAL, arg) == -1) {
    perror("semctl");
    return -1;
}

// only now is it safe to use the semaphore

请注意,您必须将union semun的定义从文档中复制到代码中;它不是由任何头提供的。

如果您开始感觉这个API很糟糕,那么您就完全正确了。您可能会发现semaphore.h API更合适,但是它不太普遍。

票数 4
EN

Stack Overflow用户

发布于 2015-03-13 23:27:56

实际上,分号手册页告诉您返回值为-1意味着出现了错误。

若要获取错误,请使用曲度误差 printf( "%s", strerror(errno) );

别忘了#include <errno.h>#include <string.h>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29043477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档