msgget(2)

НАИМЕНОВАНИЕ
msgget - возвращает идентификатор очереди сообщений System V

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

СИНТАКСИС
#include <sys/msg.h>

int msgget(key_t key, int msgflg);

ОПИСАНИЕ
Системный вызов msgget() возвращает идентификатор очереди сообщений System V, связанный со значением аргумента key. Его можно использовать для получения идентификатора уже созданной очереди сообщений (если msgflg равно нулю и значение key не равно IPC_PRIVATE) или для создания новой.

Новая очередь сообщений создаётся, если значение key равно IPC_PRIVATE, или если key не равно IPC_PRIVATE,не существует ни одной очереди сообщений с заданным ключом key и в поле msgflg указан флаг IPC_CREAT.

Если в msgflg одновременно заданы IPC_CREAT и IPC_EXCL и с таким key очередь сообщений уже существует, то msgget() завершится с ошибкой и errno будет равно EEXIST (тот же эффект как для комбинации O_CREAT | O_EXCL у open(2)).

При создании права доступа к очереди сообщений определяются младшими битами параметра msgflg. Эти биты прав имеют тот же формат и значение, что и права в аргументе mode у вызова open(2) (право на исполнение не используется).

Если создаётся новая очередь сообщений, то этот системный вызов инициализирует структуру данных msqid_ds (смотрите msgctl(2)) следующим образом:

•   Полям 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 присваивается 0.

•   В поле msg_ctime записывается текущее время.

•   В поле msg_qbytes записывается системное ограничение MSGMNB.

Если очередь сообщений уже существует, то проверяются права доступа к ней и не помечена ли она для удаления.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха msgget() возвращает идентификатор очереди сообщений (неотрицательное целое число). В случае неудачи возвращается -1, а errno устанавливается для указания ошибки.

ОШИБКИ

EACCES
    Очередь сообщений для ключа key существует, но вызывающий процесс не имеет прав доступа к ней и не имеет мандата CAP_IPC_OWNER, который управляет его пространством имён IPC.

EEXIST
    В msgflg указаны IPC_CREAT и IPC_EXCL, но очередь сообщений уже существует для key.

ENOENT
    Для ключа key не существует очереди сообщений, но в msgflg нет флага IPC_CREAT.

ENOMEM
    Очередь сообщений необходимо создать, но системе не хватает памяти для хранения новой структуры данных.

ENOSPC
    Очередь сообщений необходимо создать, но лимит, определяющий количество очередей сообщений (MSGMNI), уже достигнут.

СТАНДАРТЫ
POSIX.1-2024 XSI.

ИСТОРИЯ
SVr4, SUSv1, POSIX.1-2001 XSI.

  Linux
До Linux 2.3.20 Linux возвращал EIDRM для msgget() в очереди сообщений, запланированных для удаления.

ПРИМЕЧАНИЯ
IPC_PRIVATE является не полем с флагами, а имеет тип key_t. Если при работе с key используется это специальное значение, то системный вызов игнорирует всё, кроме 9-ти младших битов в msgflg и создаёт новую очередь сообщений (если это возможно).

На вызов msgget() влияет системное ограничение по очередям сообщений:

MSGMNI
    Системное ограничение на максимальное количество очередей сообщений. В системах Linux до версии 3.19, значением по умолчанию этого ограничения рассчитывалось на основе формулы зависящей от доступной системной памяти. Начиная с Linux 3.19, значение по умолчанию равно 32000. В Linux это ограничение можно прочитать и изменять через /proc/sys/kernel/msgmni).

ОШИБКИ
Имя IPC_PRIVATE, возможно, было выбрано неудачно, IPC_NEW отражает смысл действия более ясно.

СМОТРИТЕ ТАКЖЕ
msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) aereiae <aereiae@gmail.com>, Alexey <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Малянов Евгений Викторович <maljanow@outlook.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (debian-l10n-russian@lists.debian.org).