semget - считывает идентификатор набора семафоров
НАЗВАНИЕsemget - считывает идентификатор набора семафоров
СИНТАКСИС
#include
#include
#include
int semget(key_t key, int nsems, int semflg);
ОПИСАНИЕ
Системный вызов возвращает идентификатор набора семафоров,
связанный с аргументом key. Создается новый набор из
семафоров nsems , если значение key равно IPC_PRIVATE или
c ключом key не связано ни одного существующего набора
семафора, а выражение semflg & IPC_CREAT истинно.
Наличие в semflg полей IPC_CREAT и IPC_EXCL играет ту же
роль, что и наличие O_CREAT и O_EXCL в аргументе, заданном
для режима системного вызова open(2). Например, фукция
semget не выполняется, если semflg имеет флаги IPC_CREAT и
IPC_EXCL, а набор семафоров уже существует для key.
Младшие 9 битов аргумента semflg определяют права доступа
(для владельца, группы и остальных) к набору семафоров.Эти
биты имеют тот же формат и те же значения, что и аргумент
mode в функциях open(2) или creat(2) (хотя права на запуск
для семафоров не имеют значения, а права на запись
приравниваются к правам на изменение значений семафора).
При создании нового набора семафоров semget инициализирует
связанную с семафором структуру данных semid_ds следующим
образом:
sem_perm.cuid и sem_perm.uid присваиваются значения
идентификаторов эффективного пользователя
вызывающего процесса.
sem_perm.cgid и sem_perm.gid присваиваются значения
идентификаторов эффективной группы пользователей
вызывающего процесса.
Младшим 9 битам sem_perm.mode присваивается
значение младших 9 битам semflg.
sem_nsems присваивается значение nsems.
sem_otime присваивается значение 0.
sem_ctime устанавливается на текущее время.
Аргумент nsems может быть равен 0, если набор семафоров не
создается. Иначе аргумент nsems должен быть больше, чем 0
и меньше, либо равен максимальному количеству семафоров в
наборе (SEMMSL).
Если набор семафоров уже существует, то проверяются права
доступа.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении возвращаемое значение будет
представлять собой идентификатор набора семафоров (целое
неотрицательное значение), иначе возвращается -1, а
переменной errno присваивается номер ошибки.
КОДЫ ОШИБОК
При ошибке errno будет присвоено одно из следующих
значений:
EACCES Набор семафоров существует для ключа key, но
вызывающий процесс не имеет прав на доступ к
набору.
EEXIST Набор семафоров существует для ключа key, а в
semflg не включены флаги IPC_CREAT и IPC_EXCL.
ENOENT Набора семафоров для ключа key не существует, а
в semflg не включен флаг IPC_CREAT.
EINVAL Значение nsems меньше 0 или больше максимально
возможного для набора количества семафоров
(SEMMSL), или набор семафоров, соответствующий
key уже существует и nsems больше, чем
количество семафоров в этом наборе.
ENOMEM Набор семафоров должен быть создан, но
недостаточно памяти для создания новой
структуры.
ENOSPC Набор семафоров должен быть создан, но при этом
будет превышен системный лимит количества
наборов семафоров (SEMMNI) или системный лимит
количества семафоров (SEMMNS).
ЗАМЕЧАНИЯ
IPC_PRIVATE- не поле флага, а тип key_t. Если key равно
этому значению, то системный вызов игнорирует все, кроме
9-ти младших битов semflg и создает новый набор семафоров.
Ниже приведены ограничения на ресурсы набора семафоров,
оказывающие влияние на вызов semget.
SEMMNI Максимальное количество наборов семафоров
зависит от настроек системы.
SEMMSL Максимальное количество семафоров на один
идентификатор зависит от реализации (обычно оно
равно 500).
SEMMNS Максимальное количество семафоров зависит от
настроек системы. Значение, превышающее SEMMSL
* SEMMNI, не будет корректным.
НАЙДЕННЫЕ ОШИБКИ
Использование IPC_PRIVATE позволяет другим процессам иметь
доступ к набору семафоров.
Не существует определенного способа для процесса убедиться
в том, что он получил эксклюзивный доступ к набору
семафоров. Включение флагов IPC_CREAT и IPC_EXCL в semflg
только обеспечивает (при удачном выполнении) создание
нового набора семафоров, но не предполагает эксклюзивного
доступа к набору семафоров.
Структура данных для каждого семафора в наборе не
инициализируется системным вызовом. Для того, чтобы
инициализировать эти структуры, Вам следует использовать
вызов semctl(2), чтобы выполнить команды SETVAL или SETALL
над набором семафоров.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID. SVr4 описывает дополнительные коды ошибок
EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT.