msgget - получает идентификатор очереди сообщений
НАЗВАНИЕmsgget - получает идентификатор очереди сообщений
СИНТАКСИС
#include
#include
#include
int msgget(key_t key, int msgflg);
ОПИСАНИЕ
Эта функция возвращает идентификатор очереди сообщений,
связанный со значением параметра key . Она также создает
новую очередь сообщений, если key равен IPC_PRIVATE ; в
случае если key не равен IPC_PRIVATE,то с параметром key
не сопоставлена ни одна существующая очередь сообщений и в
поле msgflg включен флаг IPC_CREAT . (т.е., значение
msgflg&IPC_CREAT не равно нулю). Поля IPC_CREAT и
IPC_EXCL в msgflg играют ту же роль для очередей
сообщений, что и O_CREAT и O_EXCL в параметре mode
системной функции open(2): функция msgget вернет ошибку,
если в msgflg включены оба флага: IPC_CREAT и IPC_EXCL ,-
а такая очередь сообщений для key уже существует.
При создании очереди вспомогательные 9 битов параметра
msgflg определяют права доступа к очереди сообщений. Эти
биты прав имеют тот же формат и значение, что и параметр
прав доступа для системных функций open(2) или creat(2).
(Права на исполнение не используются.)
Более того, при создании очереди этот системный вызов
инициализирует системную структуру данных в очереди
сообщений msqid_ds следующим образом:
msg_perm.cuid и msg_perm.uid устанавливаются для
эффективного идентификатора пользователя,
запускающего вызывающий процесс.
msg_perm.cgid и msg_perm.gid устанавливаются для
эффективного идентификатора группы вызывающего
процесса.
Вспомогательные 9 битов msg_perm.mode
приравниваются к вспомогательным 9-и битам msgflg.
Значение
msg_qnum, msg_lspid, msg_lrpid, msg_stime и
msg_rtime равно нулю.
msg_ctime устанавливается согласно текущему
времени.
msg_qbytes устанавливается согласно системному
лимиту, заданному MSGMNB.
Если очередь сообщений уже существует, то проверяются
права доступа к ней и производится проверка, есть ли на
очереди флаг, сообщающий о ее готовности к удалению.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении вызова возвращаемое значение равно
нулю. При ошибке возвращается -1, а переменной errno
присваивается номер ошибки.
КОДЫ ОШИБОК
EACCES Очередь сообщений для ключа key существует, но
вызывающий процесс не имеет прав доступа к ней.
EEXIST Очередь сообщений для ключа key существует, а в
поле msgflg включены флаги IPC_CREAT и IPC_EXCL.
EIDRM На очереди сообщений стоит отметка, что очередь
готова к удалению.
ENOENT Для ключа key не существует очереди сообщений, а в
поле msgflg не включен флаг IPC_CREAT.
ENOMEM Очередь сообщений необходимо создать, но системе не
хватает памяти для хранения новой структуры данных.
ENOSPC Очередь сообщений необходимо создать, но лимит,
определяющий количество очередей сообщений
(MSGMNI),ужедостигнут.
ЗАМЕЧАНИЯ
IPC_PRIVATE - это не поле с флагами, а тип key_t . Если
при работе с key используется это специальное значение, то
функция игнорирует все, кроме 9-и вспомогательных битов
msgflg , и создает новую очередь сообщений (если это
возможно).
На функцию msgget влияет системный лимит очередей
сообщений.
MSGMNI (лимит очередей сообщений зависит от
ограничений системы).
НАЙДЕННЫЕ ОШИБКИ
Использование IPC_PRIVATE на самом деле не лишает другие
процессы возможностей доступа к новой очереди сообщений.
На текущий момент нет возможности процессу убедиться в
том, что он получил эксклюзивный доступ к очереди
сообщений. Включение обоих флагов: IPC_CREAT и IPC_EXCL в
поле msgflg ,- гарантирует (в случае успеха), что очередь
сообщений будет создана. В этом случае процесс не получает
эксклюзивного доступа к очереди сообщений.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID. SVr4 не описывает код ошибки EIDRM.