Книга: Программирование для 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
, значение семафора будет снова увеличено.
- Расширенная установка InterBase-сервера
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- SEMAPHORE COUNT
- Установка системы на уже подготовленный жесткий диск
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Установка файлов занятий
- 2 Установка системы
- Глава 4. Установка и конфигурирование сетевых интерфесов
- Часть III Установка, настройка и оптимизация операционной системы
- Демонтаж и установка МП
- Установка
- Установка пароля