При попытке открыть семафор sem_open не удается. errno равно 22 (), что perror описывает как «неверный аргумент». Я проверил формат имени (которое я считаю правильным), а также флаги (O_CREAT и O_EXCL, кажется, довольно сложно испортить. Что я не вижу?
Платформа OS X 10.7. Я бы предпочел использовать безымянный семафор, но ОС не поддерживает 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. Я этого не делал и искал ошибочно, когда был возвращен очень хороший семафор. Проблема решена.