Документация по LinuxLinuxDoc.Ru 🔍

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.
Читать новости Linux в Telegram
Linux - msgget - получает идентификатор очереди сообщений
Мы в соцсетях ✉