2013-09-25 5 views
0

Я пытаюсь изучить использование semophores. То, что я пытаюсь сделать, это инициализировать семафор. Затем установите значение 1, получите это значение и распечатайте его. Но каждый раз, когда я пытаюсь это сделать, он показывает мне -1. Мой код приведен ниже. Заранее спасибо.semclt всегда возвращается -1

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <time.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 

union semun { 
    int val; 
    struct semid_ds *buf; 
    ushort *array; 
    struct seminfo *__buf; 
    void *__pad; 
}; 

int main(){ 
    int pid, status, semid, value; 
    union semun semopts; 

    semid = semget(IPC_PRIVATE, 1, IPC_CREAT); 

    semopts.val = 1; 
    semctl(semid, 0, SETVAL, semopts); 

    value = semctl(semid, 0, GETVAL, 0); 
    printf("Value = %d\n", value); 

    return 0; 
} 
+3

системных вызовов часто возвращаются '-1', чтобы указать ошибку. Вы должны проверить ['errno'] (http://en.cppreference.com/w/c/error/errno), чтобы узнать, что пошло не так. Вы можете получить печатную строку ошибки, например. функция ['strerror'] (http://en.cppreference.com/w/c/string/byte/strerror). –

+1

Код отсутствует, чтобы проверить результат 'semget()', поэтому он не уверен, что значение 'semid' представляет собой действительный идентификатор набора semephore. – alk

ответ

1

Код отсутствует, по крайней мере, предоставит себе доступ на чтение/запись к созданному набору семафоров.

Для этого modifiy кода вроде этого:

if (-1 == (semid = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR))) 
{ 
    perror("semget() failed"); 
    exit (EXIT_FAILURE); 
} 
+0

Я уже проверил это. Семафор создается. Проблема связана с флагом IPC_CREAT. По-видимому, IPC_CREAT не дает права устанавливать значение в семафор. Если я использую 0777 вместо IPC_CREAT, тогда он работает. Спасибо за помощь. –

Смежные вопросы