sem_overview(7) обзор семафоров POSIX

ОПИСАНИЕ

Семафоры POSIX позволяют процессам и нитям синхронизировать свою работу.

Семафор представляет собой целое число, значение которого никогда не будет меньше нуля. Над семафорами выполняются две операции: увеличение значения семафора на единицу (sem_post(3)) и уменьшение значения семафора на единицу (sem_wait(3)). Если значение семафора равно нулю, то операция sem_wait(3) блокирует работу до тех пор, пока значение не станет больше нуля.

Есть два вида семафоров POSIX: именованные семафоры и безымянные семафоры.

Именованные семафоры
Именованные семафоры отличают по именам вида /имя — строка (с null в конце) до NAME_MAX-4 (т. е., 251) символов, состоящая из начальной косой черты и одного или нескольких символов (символ косой черты не допускается). Два процесса могут работать с одним семафором указав его имя в sem_open(3).

Функция sem_open(3) создаёт новый именованный семафор или открывает существующий. После открытия семафора с ним можно работать посредством sem_post(3) и sem_wait(3). Когда процесс закончил использовать семафор, его можно закрыть с помощью sem_close(3). Когда все процессы закончили использовать семафор, его можно удалить из системы с помощью sem_unlink(3).

Безымянные семафоры (семафоры в памяти)
Безымянные семафоры не имеют имени. Семафор размещается в области памяти, которая доступна нескольким нитям (общий семафор для нитей) или процессам (общий семафор для процессов). Общий семафор для нитей размещается в области памяти, которая доступна из нитей процесса, например в глобальной переменной. Общий семафор для процессов должен размещаться в области общей памяти (например, в сегменте общей памяти System V, созданной с помощью shmget(2), или в объекте общей памяти POSIX, созданном с помощью shm_open(3)).

Перед началом использования безымянный семафор должны быть проинициализирован с помощью sem_init(3). После этого с ним можно работать через sem_post(3) и sem_wait(3). Если семафор больше не нужен, то семафор нужно уничтожить с помощью sem_destroy(3) (но до освобождения выделенной для него памяти).

Далее в разделе описываются особенности реализации семафоров POSIX в Linux.

Версии

До ядра версии 2.6, в Linux поддерживались только безымянные общие семафоры для нитей. В системах с Linux 2.6 и glibc, предоставляющей реализацию нитей NPTL, имеется полная реализация семафоров POSIX.

Устойчивость

Именованные семафоры POSIX располагаются в ядре. Пока семафор не удалён с помощью sem_unlink(3), он остаётся в системе до её выключения.

Компоновка

Программы, в которых используется программный интерфейс семафоров POSIX, для компоновки с библиотекой реального времени librt должны компилироваться с помощью cc -pthread.

Доступ к именованным семафорам через файловую систему

В Linux, именованные семафоры создаются в виртуальной файловой системе, обычно монтируемой в /dev/shm, с именами вида sem.имя (по этой причине длина имени семафора ограничена NAME_MAX-4, а не NAME_MAX символами).

Начиная с Linux 2.6.19, для управления доступом к объектам конкретным пользователям или группам на файлы в этом каталоге могут быть применены ACL.

ЗАМЕЧАНИЯ

Семафоры System V (semget(2), semop(2) и т. п.) — это старый программный интерфейс семафоров. Семафоры POSIX предоставляют более простой и продуманный интерфейс чем семафоры System V; с другой стороны, семафоры POSIX не так широко распространены (особенно в старых системах), по сравнению с семафорами System V.

ПРИМЕР

Пример использования функций семафоров POSIX показан в sem_wait(3).