Книга: Программирование для Linux. Профессиональный подход
5.2.1. Выделение и освобождение семафоров
5.2.1. Выделение и освобождение семафоров
Функции semget()
и semctl()
выделяют и освобождают семафоры, функционируя подобно функциям shmget()
и shmctl()
. Первым аргументом функции semget()
является ключ, идентифицирующий группу семафоров; второй аргумент — это число семафоров в группе; третий аргумент — флаги прав доступа, как в функции shmget()
. Функция semget()
возвращает идентификатор группы семафоров. Если задан ключ, принадлежащий существующей группе, будет возвращен ее идентификатор. В этом случае второй аргумент (число семафоров) может равняться нулю.
Семафоры продолжают существовать даже после того, как все работавшие с ними процессы завершились. Чтобы система не исчерпала лимит семафоров, последний процесс должен явно удалить группу семафоров. Для этого нужно вызвать функцию semctl()
, передав ей идентификатор группы, число семафоров в группе, флаг IPC_RMID
и произвольное значение типа union semun
(оно игнорируется). Значение EUID (эффективный идентификатор пользователя) процесса, вызвавшего функцию, должно совпадать с аналогичным значением процесса, создавшего группу семафоров (либо вызывающий процесс должен быть запущен пользователем root
). В отличие от совместно используемых сегментов памяти, удаляемая группа семафоров немедленно освобождается.
В листинге 5.2 представлены функции, выделяющие и освобождающие двоичный семафор.
- 5.2.4. Отладка семафоров
- 3.2.1.2. Начальное выделение памяти: malloc()
- Реализация семафоров в Linux
- Выделение огромных объемов памяти
- Выделение группы файлов
- Выделение ячеек
- Выделение памяти
- Освобождение места на диске
- 10.16. Реализация с использованием семафоров System V
- Синхронизация с помощью семафоров
- Простое выделение памяти
- Статическое выделение памяти в стеке