在尝试打开信号量时,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。问题解决了。
发布于 2013-02-27 18:43:21
在尝试sem_open之前,请先尝试sem_unlink()
发布于 2015-02-08 07:19:44
名称应该有一个前导斜杠。试着在name前面加一个"/“。即。Name_counter++(name,“sprintf”,sprintf);
https://stackoverflow.com/questions/9627741
复制相似问题