msgget(2)

ИМЯ
msgget - возвращает идентификатор очереди сообщений System V

LIBRARY
Standard C library (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.

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, msgget() returns the message queue identifier (a nonnegative integer). On failure, -1 is returned, and errno is set to indicate the error.

ОШИБКИ

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

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

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

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

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

СТАНДАРТЫ
POSIX.1-2001, POSIX.1-2008, SVr4.

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

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

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

  Замечания, касающиеся Linux
Until Linux 2.3.20, Linux would return EIDRM for a msgget() on a message queue scheduled for deletion.

ДЕФЕКТЫ
Имя 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 версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.