Системный вызов возвращает идентификатор набора семафоров,
связанный с аргументом
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_NEW
более понятнее обозначает свою функцию.
Структура данных для каждого семафора в наборе не инициализируется системным вызовом.
Для того, чтобы инициализировать эти структуры, Вам следует использовать вызов
semctl(2),
чтобы выполнить команды
SETVAL
или
SETALL
над набором семафоров.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID.
SVr4 описывает дополнительные коды ошибок EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT.