Эта функция возвращает идентификатор очереди сообщений,
связанный со значением параметра
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.
ENOENT
Для ключа
key
не существует очереди сообщений, а в поле
msgflg
не включен флаг
IPC_CREAT.
ENOMEM
Очередь сообщений необходимо создать, но системе не хватает
памяти для хранения новой структуры данных.
ENOSPC
Очередь сообщений необходимо создать, но
лимит, определяющий количество очередей сообщений
(MSGMNI),ужедостигнут.
ЗАМЕЧАНИЯ
IPC_PRIVATE
- это не поле с флагами, а тип
key_t .
Если при работе с
key
используется это специальное значение, то функция игнорирует
все, кроме 9-и вспомогательных битов
msgflg
, и создает новую очередь сообщений (если это возможно).
На функцию
msgget
влияет системный лимит очередей сообщений.
MSGMNI
(лимит очередей сообщений зависит от ограничений системы).
НАЙДЕННЫЕ ОШИБКИ
Выбор имени IPC_PRIVATE видимо, был неудачным, и
IPC_NEW должно более понятно показывать свою функцию.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID.
До версии 2.3.20 Linux будет возвращать EIDRM для
msgget
в очереди сообщений, поставленных на удаление.