MQ_OPEN(3)

ИМЯ
mq_open - открывает очередь сообщений

ОБЗОР
#include <fcntl.h>           /* Постоянные вида O_* */
#include <sys/stat.h>        /* Постоянные для mode */
#include <mqueue.h>

mqd_t mq_open(const char *name, int oflag);
mqd_t mq_open(const char *name, int oflag, mode_t mode,
              struct mq_attr *attr);

Компонуется при указании параметра -lrt.

ОПИСАНИЕ
Функция mq_open() создает новую очередь сообщений POSIX или открывает существующую очередь. Очередь опознаётся по имени name. Для получения дополнительной информации о создании имени name, смотрите mq_overview(7).

В параметре oflag задаются флаги, которые управляют работой вызова (значения флагов могут быть получены при включении <fcntl.h>). Поместить в параметр oflag можно только один из ниже приведенных флагов:

O_RDONLY
    Открыть очередь только для получения сообщений.

O_WRONLY
    Открыть очередь только для отправки сообщений.

O_RDWR
    Открыть очередь для отправки и получения сообщений.

Также в oflag можно добавить ноль и более флагов, объединённых через ИЛИ:

O_CLOEXEC (начиная с Linux 2.6.26)
    Установить флаг close-on-exec на файловом дескрипторе очереди сообщений. Описание полезности этого флага смотрите в open(2).

O_CREAT
    Создать очередь сообщений, если она не существует. Владельцем (ID пользователя) очереди сообщений назначается эффективный ID пользователя вызывающего процесса. Владельцем-группой (ID группы) назначается эффективный ID группы вызывающего процесса.

O_EXCL
    Если в поле oflag выставлен флаг O_CREAT и очередь с заданным именем name уже существует, то завершить вызов ошибкой EEXIST.

O_NONBLOCK
    Открыть очередь в неблокирующем режиме. При обстоятельствах, из-за которых mq_receive(3) и mq_send(3), обычно, блокируются, теперь эти функции будут завершаться ошибкой EAGAIN.

Если в oflag указан O_CREAT, требуется задать два дополнительных аргумента. В аргументе mode задаются права доступа к новой очереди, как для open(2) (символические определения бит прав можно получить, включив <sys/stat.h>). В настройках прав учитывается umask процесса.

В полях структуры struct mq_attr, на которую указывает attr, задаётся максимальное количество сообщений и максимальный размер сообщений, разрешённых в очереди. Эта структура определена следующим образом:

    struct mq_attr {
        long mq_flags;       /* флаги (игнорируются в mq_open()) */
        long mq_maxmsg;      /* макс. кол-во сообщений в очереди */
        long mq_msgsize;     /* макс. размер сообщения (в байтах) */
        long mq_curmsgs;     /* кол-во сообщений в очереди в данный момент
                                (игнорируется в mq_open()) */
    };

В функции mq_open() используются только поля mq_maxmsg и mq_msgsize; остальные значения полей игнорируются.

Если attr равно NULL, то очередь создаётся с атрибутами по умолчанию, зависящими от реализации. Начиная с Linux 3.5, для управления атрибутами по умолчанию можно управлять через два файла в /proc; подробности смотрите в mq_overview(7).

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

ОШИБКИ

EACCES
    Очередь существует, но вызывающий не имеет прав для её открытия с заданным в mode режиме.

EACCES
    Поле name содержит больше чем одну косую черту.

EEXIST
    В oflag указаны O_CREAT и O_EXCL, но очередь name уже существует.

EINVAL
    Параметр name не соответствует формату, описанному в mq_overview(7).

EINVAL
    В oflag указан O_CREAT и attr не равно NULL, но в attr->mq_maxmsg или attr->mq_msqsize содержится некорректное значение. Оба этих поля должны быть больше нуля. Если процесс без прав (не имеет мандата CAP_SYS_RESOURCE), то attr->mq_maxmsg должно быть меньше или равно ограничению msg_max и attr->mq_msgsize должно быть меньше или равно ограничению msgsize_max. Также, даже для привилегированных процессов, значение attr->mq_maxmsg не должно превышать ограничения HARD_MAX (описание ограничений смотрите в mq_overview(7)).

EMFILE
    Было достигнуто ограничение на количество открытых дескрипторов файлов и очередей сообщений (смотрите описание RLIMIT_NOFILE в getrlimit(2)).

ENAMETOOLONG
    Слишком длинное значение аргумента name.

ENFILE
    Достигнуто ограничение на общее количество открытых файлов в системе и очередей сообщений.

ENOENT
    В oflag не указан O_CREAT и не существует очередь name.

ENOENT
    В name есть только «/» и нет других символов.

ENOMEM
    Недостаточно памяти.

ENOSPC
    Недостаточно места для создания новой очереди сообщений. Вероятно, это произошло из-за ограничения queues_max; смотрите mq_overview(7).

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
mq_open() | Безвредность в нитях | MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ

  Отличия между библиотекой C и ядром
Библиотечная функция mq_open() реализована поверх системного вызова с тем же именем. Библиотечная функция выполняет проверку того, что name начинается с косой черты (/) и выдаёт ошибку EINVAL, если это не так. Системный вызов ядра ожидает name без начальной косой черты, поэтому библиотечная функция C передаёт в системный вызов name без начальной косой черты (т. е., name+1).

ДЕФЕКТЫ
В ядрах до версии 2.6.14, значение umask процесса не накладывалось на права, указанные в mode.

СМОТРИТЕ ТАКЖЕ
mq_close(3), mq_getattr(3), mq_notify(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7)