2014-02-03 2 views
1

У меня есть этот код, который в основном делает P на семафоре с номером sem. Семафор находится в пуле. Проблема в том, что иногда я получаю Invalid argument, и я не могу понять, почему.Semop: Недопустимый аргумент

bool sem_p(key_t key, int sem){ 
    int semid = semget(key, sem, 0666); 
    struct sembuf sb = {sem, -1, 0}; 
    if(semop(semid, &sb, 1) == -1){ 
     perror("sem p"); 
     printf("sem %d\n", sem); 
     return FALSE; 
    } 
    return TRUE; 
} 

Когда эта функция вызывается, она печатает

sem p: Invalid argument 
+1

Набор семафоров не существует, или semid меньше нуля, или nsops имеет неположительное значение. Прочтите руководство :) –

+0

@ VladLazarenko Semid возвращает успех, что еще я должен проверить? – user3266496

ответ

2

Проверьте,

int semid = semget(key, sem, 0666); 

возвращает успех или неудачу. Как отметил В.Лазараненко, может быть много возможных ошибок. Проверяйте каждый код возврата для каждой отдельной функции (если они возвращают значение) - для производственных систем.

+0

Кроме того, постоянный вызов 'semget' почти наверняка не нужен. Когда у вас есть полу, у вас есть полу. – Duck

+0

Полудлит успех, что еще я должен проверить? – user3266496

+0

@ Duck Я согласен. Но это единственный код, который я вижу. Если вы сделаете звонок, проверьте код возврата. В OP: просмотрите свой код и убедитесь, что нет кодов возврата ошибок. И вы проверяете коды возврата. Это устранит множество возможных причин. –