ОПИСАНИЕ
Семафоры 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.