Man page - mq_open(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

mq_open

НАИМЕНОВАНИЕ
БИБЛИОТЕКА
ОБЗОР
ОПИСАНИЕ
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
АТРИБУТЫ
ВЕРСИИ
Отличия между библиотекой C и ядром
СТАНДАРТЫ
ИСТОРИЯ
ОШИБКИ
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

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

БИБЛИОТЕКА

Библиотека реального времени ( librt , -lrt )

ОБЗОР

#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 );

ОПИСАНИЕ

Функция 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).

Image grohtml-610025-1.png

ВЕРСИИ

Отличия между библиотекой C и ядром

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

СТАНДАРТЫ

POSIX.1-2008.

ИСТОРИЯ

POSIX.1-2001.

ОШИБКИ

Before Linux 2.6.14, the process umask was not applied to the permissions specified in mode .

СМОТРИТЕ ТАКЖЕ

mq_close (3), mq_getattr (3), mq_notify (3), mq_receive (3), mq_send (3), mq_unlink (3), mq_overview (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> и Kirill Rekhov <krekhov.dev@gmail.com>

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

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