Scroll to navigation

sem_overview(7) Miscellaneous Information Manual sem_overview(7)

ИМЯ

sem_overview - обзор семафоров 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.

Версии

Before Linux 2.6, Linux supported only unnamed, thread-shared semaphores. On a system with Linux 2.6 and a glibc that provides the NPTL threading implementation, a complete implementation of POSIX semaphores is provided.

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

Именованные семафоры 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).

СМОТРИТЕ ТАКЖЕ

sem_close(3), sem_destroy(3), sem_getvalue(3), sem_init(3), sem_open(3), sem_post(3), sem_unlink(3), sem_wait(3), pthreads(7), shm_overview(7)

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.

2 мая 2024 г. Справочные страницы Linux 6.8