Я не могу понять, как правильно использовать семафоры 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?
Я действительно не понимаю, если кто-то может меня зажечь!
Мир