SEMGET(2) | Руководство программиста Linux | SEMGET(2) |
semget - считывает идентификатор набора семафоров System V
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
Системный вызов semget() возвращает идентификатор набора семафоров System V, связанный со значением аргумента key. Его можно использовать для получения идентификатора уже созданного набора семафоров (если semflg равно нулю и значение key не равно IPC_PRIVATE) или для создания нового.
Новый набор семафоров nsems создаётся, если значение key равно IPC_PRIVATE или с ключом key не связано ни одного существующего набора семафоров, а в semflg задано IPC_CREAT.
Если в semflg одновременно указаны IPC_CREAT и IPC_EXCL и набор семафоров для key уже существует, то semget() завершается с ошибкой и errno присваивается значение EEXIST (такой же результат как с O_CREAT | O_EXCL у open(2)).
При создании в 9 начальных битах аргумента semflg указываются права (владелец, группа и др.) на набор семафоров. Формат значения битов совпадает с аргументом mode вызова open(2) (но права на выполнение для семафоров ничего не означают, а права на запись означают право изменять значения семафоров).
При создании нового набора семафоров semget() инициализирует связанную с семафором структуру данных semid_ds (см. semctl(2)) следующим образом:
Если набор семафоров не создаётся, то аргумент nsems может быть равен 0 (не учитывать). Иначе аргумент nsems должен быть больше 0 и меньше или равен максимальному количеству семафоров в наборе (SEMMSL).
Если набор семафоров уже существует, то проверяются права доступа.
При успешном выполнении возвращается идентификатор набора семафоров (неотрицательное целое), иначе возвращается -1, а переменной errno присваивается номер ошибки.
При ошибке errno присваиваются следующие значения:
SVr4, POSIX.1-2001.
Включение файлов <sys/types.h> и <sys/ipc.h> не требуется в Linux или любых версий POSIX. Однако, некоторые старые реализации требуют включения данных заголовочных файлов, и это также требуется по SVID. В приложениях, которые нужно перенести на такие старые системы, может потребоваться включить данных заголовочные файлы.
Значение IPC_PRIVATE не поле флага, а тип key_t. Если key равно этому специальному значению, то системный вызов игнорирует всё кроме 9-ти младших битов semflg и создаёт новый набор семафоров (при успешном выполнении).
Значения только что созданных семафоров не определены (в POSIX.1-2001 и POSIX.1-2008 это указано явно, хотя в POSIX.1-2008 сказано, что в будущих версиях стандарта от реализации может потребоваться инициализировать семафоры 0). Хотя Linux, подобно многим другим реализациям, инициализирует семафоры значением 0, переносимое приложение не может полагаться на это: оно должно явно инициализировать семафоры нужным значением.
Инициализацию можно выполнять с помощью semctl(2) с операцией SETVAL или SETALL. При наличии нескольких абонентов неизвестно, кто первый выполнит инициализацию, и чтобы избежать состязательности нужно проверять sem_otime на ненулевое значение в связанной структуре данных, получаемой с помощью semctl(2) и операции IPC_STAT.
Ниже приведены ограничения на ресурсы набора семафоров, оказывающие влияние на вызов semget():
Имя IPC_PRIVATE, возможно, было выбрано неудачно, IPC_NEW отражает смысл действия более ясно.
semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), svipc(7)
2018-04-30 | Linux |