Книга: Программирование для Linux. Профессиональный подход

Листинг 5.4. (sem_pv.c) Ожидание и установка двоичного семафора

Листинг 5.4. (sem_pv.c) Ожидание и установка двоичного семафора

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* Ожидание семафора. Операция блокируется до тех пор, пока
   значение семафора не станет положительным, после чего
   значение уменьшается на единицу. */
int binary_semaphore_wait(int semid) {
 struct sembuf operations[1];
 /* Оперируем одним-единственным семафором. */
 operations[0].sem_num = 0;
 /* Уменьшаем его значение на единицу. */
 operations[0].sem_op = -1;
 /* Разрешаем отмену операции. */
 operations[0].sem_flg = SEM_UNDO;
 return semop(semid, operations, 1);
}
/* Установка семафора: его значение увеличивается на единицу.
   Эта операция завершается немедленно. */
int binary_semaphore_post(int semid) {
 struct sembuf operations[1];
 /* оперируем одним-единственным семафором. */
 operations[0].sem_num = 0;
 /* Увеличиваем его значение на единицу. */
 operations[0].sem_op = 1;
 /* Разрешаем отмену операции. */
 operations[0].sem_flg = SEM_UNDO;
 return semop(semid, operations, 1);
}

Флаг SEM_UNDO позволяет решить проблему, возникающую при завершении процесса, которого есть ресурсы, связанные с семафором. Как бы ни завершился процесс — принудительно или естественным образом, — значение семафора автоматически корректируется. "отменяя" эффект операции, выполненной над семафором. Например, если процесс уменьшил значение семафора, а затем был уничтожен командой kill, значение семафора будет снова увеличено.

Оглавление книги


Генерация: 2.489. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз