mq_open()

Открыть очередь сообщений

Прототип:

#include <mqueue.h>
mqd_t mq_open( const char *name,
int oflag,
... );

Аргументы:

name
Имя очереди сообщений, которую необходимо открыть.
oflag
Вы должны указать один из флагов: O_RDONLY (только приём), O_WRONLY (только отправка) или O_RDWR (отправка-получение). Кроме того, вы можете использовать ИЛИ в следующих константах для получения следующих эффектов:
O_CREAT
Если очередь с именем, заданным параметром name не существует, указать серверу создать новую очередь сообщений с заданным именем. При указании этого флага mq_open() использует параметры mode и mq_attr.
O_EXCL
Если одновременно устанавливаются флаги O_EXCL и O_CREAT, а очередь сообщений с именем, заданным параметром name существует, вызов завершится ошибкой, а errno будет установлено в значение EEXIST. В противном случае очередь создастся нормально. Если будет установлен флаг O_EXCL без флага O_CREAT, он будет проигнорирован.
O_NONBLOCK
В обычном режиме работы очереди сообщений вызовы функций mq_send() или mq_receive() являются блокирующими, если очередь сообщений заполнена или пуста. Если этот флаг будет установлен, эти вызовы не будут блокирующими. Если очередь не сможет выполнить данные запросы, в errno будет записано значение EAGAIN, вызов завершится с ошибкой.
mode
При установке флага O_CREAT в параметре oflag необходимо также передать этот параметр. Права доступа к файлу для новой очереди. Для получения дополнительной информации см. struct stat. Если будут установлены какие-либо биты, кроме битов прав доступа к файлам, они будут проигнорированы. Разрешения на чтение и запись аналогичны разрешениям на получение и отправку; разрешения на выполнение игнорируются.
mq_attr
При установке флага O_CREAT в параметре oflag необходимо также передать этот параметр. NULL или указатель на структуру struct mq_attr, содержащую атрибуты, которые необходимо использовать для новой очереди. Для получения дополнительной информации см. mq_getattr(). Если mq_attr содержит значение NULL, то используются следующие атрибуты по умолчанию — в зависимости от того, какая реализация очередей сообщений используется — при условии, что значения по умолчанию не были переопределены при запуске сервера очередей сообщений. Атрибуты:
mq_maxmsg
Классическая реализация: 1024, альтернативная: 64
mq_msgsize
Классическая реализация: 4096, альтернативная: 256
mq_flags
Классическая реализация: 0, альтернативная: 0
Если значение параметра mq_attr не равно NULL, новая очередь использует значения полей mq_maxmsg и mq_msgsize из mq_attr. Поле флагов mq_flags игнорируется.

Библиотека:

Описание:

Функция mq_open() открывает очередь сообщений, имя которой задаётся параметром name, и возвращает дескриптор очереди сообщений, с помощью которого можно будет обращаться к очереди в будущем.


Note: Нейтрино поддерживает две реализации очередей сообщений: классическую реализацию и альтернативную, использующую асинхронные сообщения. Для дополнительной информации см. документацию по mq и mqueue.

Имя интерпретируется следующим образом:


Note: Если необходимо открыть очередь на другом узле, вы должны использовать традиционную реализацию (mqueue) и указать имя как /net/node/mqueue_location.

Если очередь, с заданным именем name не существует, функция mq_open() проверяет третий и четвертый параметры: mode_t и указатель на структуру struct mq_attr.

Единственный случай, когда вызов mq_open() с установленным флагом O_CREAT терпит неудачу, это если происходит открытие очереди сообщений, а затем попытка её удаления, но при этом она ни разу не закрывается. Как и файловые аналоги, удаляемая очередь, которая ещё не была закрыта, должна продолжать существовать; попытка открыть такую очередь сообщений заново терпит неудачу, а errno устанавливается в ENOENT.


Note: Очереди сообщений сохраняются, как и файлы, даже после завершения процессов, создавших их. Очередь сообщений уничтожается, когда последний подключенный к ней процесс отсоединяется от очереди, вызывая функцию mq_unlink().

Возвращаемое значение:

Допустимый дескриптор очереди сообщений, если очередь успешно создана.

Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EACCES
Очередь сообщений существует, но права на открытие очереди с данными флагами oflag отсутствуют, или очередь сообщений отсутствует, и отсутствуют права на её создание.
EEXIST
Были заданы флаги O_CREAT и O_EXCL в oflag, но очередь с именем, заданным параметром name, уже существует.
EINTR
Вызов прерван сигналом.
EINVAL
Был указан флаг O_CREAT в параметре oflag и параметр mq_attr не равен NULL, но некоторые значения в структуре struct mq_attr являются недопустимыми.
ELOOP
Слишком много уровней символических ссылок или префиксов.
EMFILE
Вызывающий процесс использует слишком много файловых дескрипторов.
ENAMETOOLONG
Длина имени name превышает значение PATH_MAX.
ENFILE
В системе открыто слишком много очередей сообщений.
ENOENT
Не установлен флаг O_CREAT, и очередь с именем, заданным параметром name, не существует.
ENOSPC
На сервере очереди сообщений закончилась память.
ENOSYS
Функция mq_open() не реализована для файловой системы, заданной в параметре name, или менеджер очереди сообщений ( mq или mqueue) не запущен.

Классификация:

POSIX 1003.1 Message Passing

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

struct stat, struct mq_attr, mq_close(), mq_getattr(), mq_notify(), mq_receive(), mq_send(), mq_setattr(), mq_timedreceive(), mq_timedsend(), mq_unlink()

mq, mqueue в Справочнике по Утилитам




Предыдущий раздел: Описание API системной библиотеки