尝试打开信号量时 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/