Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

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

LIBRARY

       Real-time library (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).

       ┌───────────────────────────────────────────────────────┬──────────────────────┬──────────┐
       │ИнтерфейсАтрибутЗначение │
       ├───────────────────────────────────────────────────────┼──────────────────────┼──────────┤
       │mq_open()                                              │ Безвредность в нитях │ MT-Safe  │
       └───────────────────────────────────────────────────────┴──────────────────────┴──────────┘

СТАНДАРТЫ

       POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ

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

ДЕФЕКТЫ

       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>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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