Почему я не могу взаимодействовать с семафорами System V, которые я создал? - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь использовать семафоры System V в C для лаборатории, но мои курсы мне не помогают.

Я могу создать свой семафор и удалить его (используя semget () и semctl ( )), но я не могу взаимодействовать с ним: его значение всегда остается неизменным (0), и он не выполняет свою работу с семафорами, когда я его об этом спрашиваю (с помощью semop ()).

По Кстати, ниже я извлек код, уже написанный для моего семафора:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int main()
{
    // some code

    int sem;

    struct sembuf up = {0,1,0};
    struct sembuf down = {0,-1,0};

    sem = semget(IPC_PRIVATE, 1, 777 | IPC_CREAT);
       // Tried with 777 because why not. Originally at 600
       // but it gave me a "Permission denied" error.

    semop(sem, &up, 1); // up

    // some critical code

    semop(sem, &down, 1); // ... and down
    semctl(sem, 0, IPC_RMID); // deletion
}

Кто-нибудь знает, чего не хватает в моем коде, чтобы заставить мой семафор работать?

NB: Нет, я могу ' t использовать семафоры POSIX. Да, я знаю, это грустно.

1 Ответ

3 голосов
/ 10 февраля 2020

То, что возвращает функция semget(), это не "семафора", это идентификатор набора семафоров (или, в вашем случае, одного семафора, так как вы создаете набор размера 1). Этот установленный идентификатор останется 0 и не изменится, независимо от того, что происходит с самим семафором - который не является переменной в вашей программе.

Взаимодействие с семафором происходит только через semop() и semctl() функций (и, возможно, semtimedop(). Например, если у нас есть:

union semun  
{
    int val;
    struct semid_ds *buf;
    ushort array [1];
} sem_attr;
int result;

, мы можем написать:

sem_attr.val = 1;
result = semctl (semaphore_set_index, 0, SETVAL, sem_attr);
if (result == -1) { /* handle error here */ }

, который устанавливает значение семафора в 1.


Примечания:

  • Я игнорирую вашу ссылку на clang против другого компилятора.
  • Как подсказывает @ThomasJager - всегда проверьте возвращаемые значения вашего вызова API на наличие ошибок.
  • Я частично основываю этот ответ на этой статье:

    Семафоры System V в Linux

...