Семафоры OSX: неверный аргумент в sem_open - PullRequest
2 голосов
/ 09 марта 2012

При попытке открыть семафор 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. Я этого не делал и искал ошибочно, когда был возвращен очень хороший семафор. Проблема решена.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2015

имя должно иметь начальную косую черту.Попробуйте поставить «/» перед именем.то есть.sprintf (name, "/ xyz_sem_% d", name_counter ++);

0 голосов
/ 27 февраля 2013

Перед тем как попробовать sem_open, попробуйте sem_unlink ()

...