Создать или обратиться к именованному семафору
#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 системной библиотеки