Инициализация семафора
У меня есть семафор, который я пытался изменить значение, и он не удается. После прочтения 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
и это работало нормально очень странно, я не знаю, спасибо за все ответы, хотя
1 ответ
Возможно, вы пропустили инициализацию semId
до звонка semctl()
,
Попробуйте добавить следующее:
int semId = -1;
...
semId = semget(IPC_PRIVATE, 1, IPC_CREAT);
if (-1 == semId)
perror("semget() failed");
else {
/* Your call to semctl() */
}