инициализация семафора

У меня есть семафор, значение которого я пытался изменить, и это не удалось. Прочитав страницу man, я узнал, что если значение меньше 0 и вы используете SETVAL, произойдет сбой (я его не инициализировал). Но когда я инициализирую его, я получаю «удаленный идентификатор», когда я вызываю perror(). Я не уверен, что это относится к SETALL или союзу.

Моя инициализация выглядит так:

union semun argument; 
unsigned short values[1]; 
values[0] = 1; 
argument.array = values; 
int retVal;

//INITIALIZE our semaphore
if(retVal = semctl(semId, 0, SETALL, argument) == -1)
{
    perror("semaphore INITIALIZATION failed\n");
    exit(1);
}

У меня есть мой союз, объявленный так же, как на странице руководства и на некоторых других веб-сайтах, и у меня есть проверка после semget(), чтобы убедиться, что он возвращает семафор, поэтому я знаю, что эта часть работает правильно. Если бы кто-нибудь мог сказать мне, где я ошибаюсь, я был бы очень признателен.

Также, если бы кто-нибудь мог объяснить причину моей ошибки, чтобы я мог извлечь уроки из своей ошибки, это было бы очень полезно.

Спасибо

ОБНОВЛЕНИЕ: по-видимому, ему не понравился == -1, поэтому я изменил его на < 0, и он работал нормально, очень странно, я не знаю, спасибо за все ответы, хотя


person cpowel2    schedule 03.03.2012    source источник
comment
Есть ли причина, по которой вам нужны/нужны семафоры SysV? Семафоры POSIX, как правило, намного лучше (более разумный API и намного быстрее, поскольку их можно реализовать в пользовательском пространстве), но не такие мощные и могут быть недоступны в действительно старых системах.   -  person R.. GitHub STOP HELPING ICE    schedule 03.03.2012
comment
Когда и как вы установили semId?   -  person alk    schedule 03.03.2012


Ответы (1)


Вероятно, вы пропустили инициализацию semId перед вызовом semctl().

Попробуйте добавить следующее:

int semId = -1;

...

semId = semget(IPC_PRIVATE, 1, IPC_CREAT);
if (-1 == semId)
   perror("semget() failed");
else {
/* Your call to semctl() */
}
person alk    schedule 03.03.2012