Создать или обратиться к именованному семафору
#include <semaphore.h>sem_t * sem_open( const char *sem_name,int oflags,... );
O_CREAT
. Если семафор с именем sem_name уже существует, то при создании нового именованного семафора, функция sem_open() вернет ошибку. Без O_EXCL
, sem_open() откроет существующий семафор или создает новый, если sem_name не существует. ![]() | Не устанавливайте oflags в O_RDONLY , O_RDWR или O_WRONLY . Поведение семафора с ними не определено. Библиотеки ЗОСРВ «Нейтрино» игнорируют эти опции, но они могут ухудшить переносимость кода. |
O_CREAT
в oflag, то данный аргумент также должен быть задан. Для переносимости следует установить биты read, write и execute в одно и то же значение. Проще сделать это с помощью макросов из <sys/stat.h>
: O_CREAT
в oflag, то данный аргумент также должен быть задан. Положительное значение указывает на разблокированный семафор, 0
указывает на заблокированный семафор. Это значение не должно превышать SEM_VALUE_MAX
.libc
Функция sem_open() создает именованный семафор или получает к нему доступ, если он уже создан. Именованные семафоры медленнее, чем неименованные семафоры, созданные с помощью sem_init(). Семафоры обрабатываются до тех пор, пока система функционирует.
![]() | Для использования именованного семафора, необходимо запустить менеджер именованных семафоров. procnto-* управляет именованными семафоры напрямую. Если procnto-* не осуществляет данный контроль, то управление семафорами перехватывает mqueue. |
Функция semi_open() возвращает дескриптор семафора, который можно использовать в sem_wait(), sem_trywait() и sem_post(). Семафор доступен для использования его до тех пор, пока не вызована функция sem_close(). Также можно разорвать связь с семафором, вызвав sem_unlink(). При этом семафор будет уничтожен лишь тогда, когда все потоки разорвут с ним связь.
Именованные семафоры всегда создаются в /dev/sem
:
/
, семафору присваивается указанное имя. /
, семафору присваивается указанное имя с префиксом, характеризиющим текущий каталог. Символы /
, кроме начального, не интерпретируются. Указанное имя, включая /
, используется для идентификации семафора. То есть дополнительные символы /
не создают структуру каталогов в /dev/sem
. Например, если ваш текущий каталог /tmp
:
name | Полный путь |
---|---|
/my_sem | /dev/sem/my_sem |
my_sem | /dev/sem/tmp/my_sem |
![]() | Если необходимо создать семафор или получить к нему доступ на другом узле, укажите имя как /net/node/sem_location . |
![]() | Не следует смешивать операции с именованными семафорами (sem_open() и sem_close()) с операциями с неименованными семафорами ( sem_init() и sem_destroy()) над одним и тем же дескриптором семафора. |
Указатель на успешно созданный или открытый семафор. Если возникла ошибка функция возвращает SEM_FAILED
, код ошибки записывается в errno.
O_CREAT
и O_EXCL
в oflags, но семафор уже существует. SEM_VALUE_MAX
. NAME_MAX
- 8
). O_CREAT
не указан в oflags. POSIX 1003.1 Semaphores
struct stat, sem_close(), sem_destroy(), sem_init(), sem_post(), sem_trywait(), sem_unlink(), sem_wait()
Предыдущий раздел: Описание API системной библиотеки