macos - OSX 信号量 : Invalid argument in sem_open

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

平台是 OS X 10.7。我宁愿使用无名信号量,但是 OS doesn't support sem_init .

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);

我都试过了

sem_open(name, O_CREAT | O_EXCL);

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。问题解决了。

最佳答案

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

https://stackoverflow.com/questions/9627741/

相关文章:

assembly - 与 NASM 打个近亲电话

android - 微调器依赖于 android 中的另一个微调器

css - 宽度为 100% 的额外一个像素

asp.net-mvc-3 - 哪个是公开实体或 DTO 以在 mvc3 中查看的最佳实践?

git - 如何从 git 存储库中完全删除数据?

google-chrome-extension - float popup.html div

post - 无法打开流 : HTTP request failed! HTTP/1.0 400 错

ruby-on-rails-3 - 在 Rails 模型中一起验证日期和时间字段

.NET - WinDBG - 字符串的内容

c# - 从任务计划程序运行时,Windows 服务器上的预定 C# 控制台应用程序不显示控制台