Открыть очередь сообщений
#include <mqueue.h>mqd_t mq_open( const char *name,int oflag,... );
O_RDONLY
(только приём), O_WRONLY
(только отправка) или O_RDWR
(отправка-получение). Кроме того, вы можете использовать ИЛИ в следующих константах для получения следующих эффектов: O_EXCL
и O_CREAT
, а очередь сообщений с именем, заданным параметром name существует, вызов завершится ошибкой, а errno будет установлено в значение EEXIST
. В противном случае очередь создастся нормально. Если будет установлен флаг O_EXCL
без флага O_CREAT
, он будет проигнорирован. EAGAIN
, вызов завершится с ошибкой. O_CREAT
в параметре oflag необходимо также передать этот параметр. Права доступа к файлу для новой очереди. Для получения дополнительной информации см. struct stat. Если будут установлены какие-либо биты, кроме битов прав доступа к файлам, они будут проигнорированы. Разрешения на чтение и запись аналогичны разрешениям на получение и отправку; разрешения на выполнение игнорируются.O_CREAT
в параметре oflag необходимо также передать этот параметр. NULL
или указатель на структуру struct mq_attr, содержащую атрибуты, которые необходимо использовать для новой очереди. Для получения дополнительной информации см. mq_getattr(). Если mq_attr содержит значение NULL
, то используются следующие атрибуты по умолчанию — в зависимости от того, какая реализация очередей сообщений используется — при условии, что значения по умолчанию не были переопределены при запуске сервера очередей сообщений. Атрибуты: 1024
, альтернативная: 64
4096
, альтернативная: 256
0
, альтернативная: 0
NULL
, новая очередь использует значения полей mq_maxmsg и mq_msgsize из mq_attr. Поле флагов mq_flags игнорируется.
Функция mq_open() открывает очередь сообщений, имя которой задаётся параметром name, и возвращает дескриптор очереди сообщений, с помощью которого можно будет обращаться к очереди в будущем.
Нейтрино поддерживает две реализации очередей сообщений: классическую реализацию и альтернативную, использующую асинхронные сообщения. Для дополнительной информации см. документацию по mq и mqueue. |
Имя интерпретируется следующим образом:
Имя name | Пространство имён пути |
---|---|
/entry | /dev/mqueue/entry |
/entry/newentry | /entry/newentry |
entry | cwd/entry |
entry/newentry | cwd/entry/newentry |
/dev/mq
(или в каталоге, путь к которому указывается опцией -N для mq). /dev/mq
. Например, если ваш текущий каталог — /tmp
: Имя name | Пространство имён пути |
---|---|
/entry | /dev/mq/entry |
entry | /dev/mq/tmp/entry |
Если необходимо открыть очередь на другом узле, вы должны использовать традиционную реализацию (mqueue) и указать имя как /net/node/mqueue_location . |
Если очередь, с заданным именем name не существует, функция mq_open() проверяет третий и четвертый параметры: mode_t
и указатель на структуру struct mq_attr.
Единственный случай, когда вызов mq_open() с установленным флагом O_CREAT
терпит неудачу, это если происходит открытие очереди сообщений, а затем попытка её удаления, но при этом она ни разу не закрывается. Как и файловые аналоги, удаляемая очередь, которая ещё не была закрыта, должна продолжать существовать; попытка открыть такую очередь сообщений заново терпит неудачу, а errno устанавливается в ENOENT
.
Очереди сообщений сохраняются, как и файлы, даже после завершения процессов, создавших их. Очередь сообщений уничтожается, когда последний подключенный к ней процесс отсоединяется от очереди, вызывая функцию mq_unlink(). |
Допустимый дескриптор очереди сообщений, если очередь успешно создана.
Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
O_CREAT
и O_EXCL
в oflag, но очередь с именем, заданным параметром name, уже существует. O_CREAT
в параметре oflag и параметр mq_attr не равен NULL
, но некоторые значения в структуре struct mq_attr являются недопустимыми. PATH_MAX
. O_CREAT
, и очередь с именем, заданным параметром name, не существует. 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 системной библиотеки