sem_open()

Создать или обратиться к именованному семафору

Прототип:

#include <semaphore.h>
sem_t * sem_open( const char *sem_name,
int oflags,
... );

Аргументы:

sem_name
Имя семафора, который необходимо создать или получить к нему доступ.
oflags
Комбинация флагов, влияющих на создание семафора (если семафор с именем sem_name уже создан, данный аргумент игнорируется):
O_CREAT
Создание нового именованного семафора. Если этот бит установлен, необходимо предоставить аргументы mode и value для semi_open().
O_EXCL
Используется только в сочетании с флагом O_CREAT. Если семафор с именем sem_name уже существует, то при создании нового именованного семафора, функция sem_open() вернет ошибку. Без O_EXCL, sem_open() откроет существующий семафор или создает новый, если sem_name не существует.

Note: Не устанавливайте oflags в O_RDONLY, O_RDWR или O_WRONLY. Поведение семафора с ними не определено. Библиотеки ЗОСРВ «Нейтрино» игнорируют эти опции, но они могут ухудшить переносимость кода.

mode_t mode
Если установлен флаг O_CREAT в oflag, то данный аргумент также должен быть задан. Для переносимости следует установить биты read, write и execute в одно и то же значение. Проще сделать это с помощью макросов из <sys/stat.h>:
S_IRWXG
для группового доступа.
S_IRWXO
для доступа других лиц.
S_IRWXU
для доступа владельца.

Для получения дополнительной информации см. struct stat.
unsigned int value
Если установлен флаг O_CREAT в oflag, то данный аргумент также должен быть задан. Положительное значение указывает на разблокированный семафор, 0 указывает на заблокированный семафор. Это значение не должно превышать SEM_VALUE_MAX.

Библиотека:

libc

Описание:

Функция sem_open() создает именованный семафор или получает к нему доступ, если он уже создан. Именованные семафоры медленнее, чем неименованные семафоры, созданные с помощью sem_init(). Семафоры обрабатываются до тех пор, пока система функционирует.


Note: Для использования именованного семафора, необходимо запустить менеджер именованных семафоров. 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


Note: Если необходимо создать семафор или получить к нему доступ на другом узле, укажите имя как /net/node/sem_location.


Note: Не следует смешивать операции с именованными семафорами (sem_open() и sem_close()) с операциями с неименованными семафорами ( sem_init() и sem_destroy()) над одним и тем же дескриптором семафора.

Возвращаемое значение:

Указатель на успешно созданный или открытый семафор. Если возникла ошибка функция возвращает SEM_FAILED, код ошибки записывается в errno.

Коды ошибок:

EACCES
Именованный семафор существует, но отсутствуют разрешения на доступ к нему; произведена попытка создать семафор, но отсутствуют соответствующие разрешения.
EEXIST
Установлены флаги O_CREAT и O_EXCL в oflags, но семафор уже существует.
EINVAL
Аргумент sem_name недействителен или при создании семафора value больше, чем SEM_VALUE_MAX.
EINTR
Вызов функции был прерван сигналом.
ELOOP
Слишком много уровней символических ссылок или префиксов.
EMFILE
Процесс использует слишком много дескрипторов файлов или семафоров.
ENFILE
Система исчерпала ресурсы и не смогла открыть семафор.
ENAMETOOLONG
Аргумент sem_name длиннее, чем (NAME_MAX - 8).
ENOENT
Менеджер именованных семафоров ( mqueue или procnto-*) не запущен, либо семафор sem_name не существует, но флаг O_CREAT не указан в oflags.
ENOSPC
Недостаточно места для создания нового именованного семафора.
ENOSYS
Функция sem_open() не реализована для файловой системы, связаннорй в sem_name.

Классификация:

POSIX 1003.1 Semaphores

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

struct stat, sem_close(), sem_destroy(), sem_init(), sem_post(), sem_trywait(), sem_unlink(), sem_wait()

mqueue, procnto-*




Предыдущий раздел: Описание API системной библиотеки