【问题标题】:OSX semaphores: Invalid argument in sem_openOSX 信号量:sem_open 中的参数无效
【发布时间】:2012-03-26 12:44:47
【问题描述】:

尝试打开信号量时 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。问题解决了。

【问题讨论】:

  • @leebaker:你找到解决问题的方法了吗?

标签: macos semaphore


【解决方案1】:

name 应该有一个前导斜杠。尝试在名称前加一个“/”。 IE。 sprintf(name, "/xyz_sem_%d", name_counter++);

【讨论】:

  • 在哪里记录了信号量名称应该以斜杠开头?这是惯例还是硬性要求?
  • 没有 OSX,Freebsd,'man sem_open' 说....其他斜线字符。" ,在 linux 上与 'man sem_overview' 中的内容相同,因此对于 OSX 也是如此
  • iOS/Mac OS 似乎没有这个要求。我正在使用名称以字母开头并包含字母数字和斜杠的信号量,它们工作正常。
【解决方案2】:

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

【讨论】:

  • 这对我没有帮助
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2019-08-10
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多