首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OSX信号量: sem_open中的参数无效

OSX信号量: sem_open中的参数无效
EN

Stack Overflow用户
提问于 2012-03-09 09:29:47
回答 2查看 2.6K关注 0票数 3

在尝试打开信号量时,sem_open失败。errno为22 (),perror将其描述为“无效参数”。我已经检查了名称的格式(我认为是正确的),以及标志(O_CREAT和O_EXCL似乎很难混淆。我没看到的是什么?

平台是OS X 10.7。我更喜欢使用无名信号量,但是OS doesn't support sem_init

代码语言:javascript
运行
复制
int name_counter = 0;

// In order to create a unique semaphore, we iterate until we find a name that
// does not already exist.
do {
    char name[48] = {0};
    sprintf(name, "xyz_sem_%d", name_counter++);
    job_semaphore = sem_open(name, O_CREAT | O_EXCL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, 0);
} while(errno == EEXIST);

if(0 != errno)
    perror("Error opening xyz semaphore");
assert(0 == errno);

我都试过了

代码语言:javascript
运行
复制
sem_open(name, O_CREAT | O_EXCL);

代码语言:javascript
运行
复制
sem_open(name, O_CREAT | O_EXCL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, 0);

来打开信号量,但每个信号量都会得到相同的结果。我遗漏了什么?

编辑:上面只有两个参数的版本是错误的-手册页上说当包含O_CREAT时,您必须提供所有4个参数。

EDIT2:只有当函数返回错误代码时,errno才有效。在本例中,我应该只在sem_open返回SEM_FAILED时查看errno。我没有这样做,当一个非常好的信号量被返回时,我正在检查errno。问题解决了。

EN

回答 2

Stack Overflow用户

发布于 2013-02-27 18:43:21

在尝试sem_open之前,请先尝试sem_unlink()

票数 0
EN

Stack Overflow用户

发布于 2015-02-08 07:19:44

名称应该有一个前导斜杠。试着在name前面加一个"/“。即。Name_counter++(name,“sprintf”,sprintf);

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

https://stackoverflow.com/questions/9627741

复制
相关文章

相似问题

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