Использование IP C Семафоры (SysV) - PullRequest
0 голосов
/ 12 февраля 2020

Я не могу понять, как правильно использовать семафоры IP C, даже если концепция проста.

Я пытаюсь использовать двоичный семафор (0/1).

У меня есть creation.c, который создает мои fifos, shm и мои семафоры:

/* creation.c */

#define SEM_KEY 667

int main(){
   /* Creation of everything */

   /* Creation of SEMAPHORE */

   int semid;
   // struct sembuf sem_buf;
   // struct semid_ds buf;
   // int sem_retval;

   semid = semget(SEM_KEY, 1, IPC_CREAT | IPC_CREAT | 0666);

   return 0;
}

Затем у меня есть 3 процесса, которые должны записать в общую память, но синхронизировать с семафором, и я надеваю не знаю, если я иду в правильном направлении. У меня есть pl1.c, pl2.c и pl3.c.

/* pl1.c */

#define SEM_KEY 667

int main(){

    /* Does eveything it has to do... */

    /* NEED TO WRITE IN SHM --> SEMAPHORE */

    int semid;
    int sem_retval;
    struct sembuf sem_buf;
    struct semid_ds buf;

    semid = semget(SEM_KEY, 1, 0);

    if (semid >= 0) //PL1 HAS THE SEMAPHORE
    {
        printf("\nPL1 HAS THE SEMAPHORE !\n");
    }
    else if (errno == EEXIST) //SOMEONE ELSE HAS THE SEMAPHORE
    {
        printf("\nPL1 IS WAITING FOR THE SEMAPHORE !\n");
        semid = semget(SEM_KEY, 1, 0);
        if (semid < 0)
        {
            perror("Semaphore PL1 GET: ");
            return;
        }

        sem_buf.sem_op = 0;
        sem_buf.sem_flg = 0;
        sem_buf.sem_num = 0;
        sem_retval = semop(semid, &sem_buf, 1); // PL1 WAITS FOR THE SEMAPHORE TO BE AT 0
        if (sem_retval == -1)
        {
            perror("Semaphore PL1 Locked: ");
            return;
        }
    }

    sem_buf.sem_op = -1;
    sem_buf.sem_flg = 0;
    sem_buf.sem_num = 0;
    sem_retval = semop(semid, &sem_buf, 1);
    if (sem_retval == -1)
    {
        perror("Semaphore PL1 Operation: ");
        return;
    }

    /* Writes in SHM */

    // FREE THE SEMAPHORE

    sem_buf.sem_op = 1;
    sem_retval = semop(semid, &sem_buf, 1);
    if (sem_retval == -1)
    {
        perror("Semaphore PL1 Locked: ");
        return;
    }

}

А потом pl2.c и pl3.c почти одинаковы.

Но я уверен, что я я не прав Если я не ошибаюсь, SEM инициализируется в 1? И если процесс принимает SEM, значение операции должно быть равно -1, поэтому оно становится равным 0, но поэтому процесс, ожидающий пробуждения 0, не должен ли он ожидать значения SEM, равного 1? Затем, когда pl1 завершает свой процесс, он «освобождает» SEM с помощью операции +1, кажется, logi c, поэтому SEM переходит к 1, верно? Но другие процессы ждут значения SEM, равного 0?

Я действительно не понимаю, если кто-то может меня зажечь!

Мир

...