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

时间:2012-03-09 01:29:47

标签: macos semaphore

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

2 个答案:

答案 0 :(得分:0)

在尝试sem_open之前,请尝试使用sem_unlink()

答案 1 :(得分:0)

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