sem_open - инициализирует и открывает именованный семафор
sem_open(3)
инициализирует и открывает именованный семафор
ОБЗОР
#include <fcntl.h> /* константы O_* */
#include <sys/stat.h> /* константы для mode */
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
mode_t mode, unsigned int value);
Компонуется при указании параметра -pthread.
ОПИСАНИЕ
Функция
sem_open() создаёт новый семафор POSIX или открывает существующий
семафор. Семафору присваивается имя
name. Подробней об устройстве
name
смотрите
sem_overview(7).
В аргументе oflag задаются флаги, которые управляют работой вызова
(определения значений флагов можно получить включив
<fcntl.h>). Если в oflag указано O_CREAT, то семафор
создаётся, если ещё не существует. Владельцем (ID пользователя) семафора
устанавливается эффективный ID пользователя вызывающего процесса. Владельцем
группы (ID группы) устанавливается эффективный ID группы вызывающего
процесса. Если в oflag указаны O_CREAT и O_EXCL одновременно и
семафор с заданным name уже существует, то возвращается ошибка.
Если в oflag указано O_CREAT, то должны быть заданы ещё два
аргумента. В аргументе mode задаются права для нового семафора, подобно
open(2) (символические определения бит прав можно получить включив
<sys/stat.h>). Настройки прав маскируются маской процесса. Права
чтения и записи должны быть заданы для каждого класса пользователей, которым
нужен доступ к семафору. В аргументе value задаётся начальное значение
нового семафора. Если указан O_CREAT и семафор с заданным name
существует, то mode и value игнорируются.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении
sem_open() возвращает адрес нового семафора; этот
адрес используется при вызове других функций, работающих с семафорами. При
ошибке
sem_open() возвращает
SEM_FAILED, а в
errno записывается
номер ошибки.
ОШИБКИ
EACCES
Семафор существует, но вызывающий не имеет прав для его открытия.
EEXIST
В oflag указаны O_CREAT и O_EXCL, но семафор name уже
существует.
EINVAL
Значение value было больше SEM_VALUE_MAX.
EINVAL
В name есть только «/», и нет других символов.
EMFILE
Было достигнуто ограничение по количеству открытых файловых дескрипторов на
процесс.
ENAMETOOLONG
Слишком длинное значение аргумента name.
ENFILE
Достигнуто максимальное количество открытых файлов в системе.
ENOENT
В oflag не указан O_CREAT и семафор name не существует; или указан
O_CREAT, но name указан в некорректной форме.
ENOMEM
Недостаточно памяти.
АТРИБУТЫ
Описание терминов данного раздела смотрите в
attributes(7).
Интерфейс Атрибут Значение
sem_open()
безвредность в потоках: безвредно (MT-Safe)
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.