Provided by: manpages-ru_4.27.0-1_all bug

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

       mq_overview - обзор очередей сообщений POSIX

ОПИСАНИЕ

       Очереди  сообщений  POSIX  позволяют  процессам обмениваться данными в виде сообщений. Данный программный
       интерфейс отличается от используемого в очередях сообщений System  V  (msgget(2),  msgsnd(2),  msgrcv(2),
       etc.), но предоставляет схожие возможности.

       Очереди сообщений создаются и открываются с помощью mq_open(3); эта функция возвращает дескриптор очереди
       сообщений  (mqd_t),  который используется в последующих вызовах для ссылки на открытую очередь сообщений.
       Каждая очередь сообщений описывается именем в виде /некое_имя; оно представляет собой  строку  с  null  в
       конце  и  длиной  до  NAME_MAX  (т. е., 255) символов, состоящую из начальной косой черты, одного и более
       символа (любого, кроме косой черты).  Два  процесса  могут  работать  через  одну  очередь,  если  укажут
       одинаковое имя в mq_open(3).

       Сообщения  передаются  в  и  из  очереди  с  помощью  функций  mq_send(3)  и mq_receive(3). Когда процесс
       прекращает использовать очередь, он закрывает её с помощью функции mq_close(3), и если очередь больше  не
       нужна,  то  она  может  быть удалена с помощью функции mq_unlink(3). Атрибуты очереди можно получить и (в
       некоторых случаях) изменить с помощью функций mq_getattr(3)  и  mq_setattr(3).  Процесс  может  запросить
       асинхронное уведомление о поступлении сообщения в пустую очередь с помощью функции mq_notify(3).

       Дескриптор  очереди  сообщений  —  это  ссылка на открытое описание очереди сообщений (смотрите open(2)).
       После вызова fork(2) потомок наследует копии дескрипторов очередей сообщений родителя и  эти  дескрипторы
       ссылаются  на  те  же открытые описания очередей сообщений родителя. Соответствующие дескрипторы очередей
       сообщений двух процессов используют общий флаг (mq_flags), который связан с  открытым  описанием  очереди
       сообщений.

       У  каждого  сообщения  есть  приоритет,  и  сначала  в  принимающий процесс всегда доставляются сообщения
       наивысшим  приоритетом.  Диапазон  приоритетов  сообщений:  0  (низший)  —   sysconf(_SC_MQ_PRIO_MAX) - 1
       (высший). В Linux, sysconf(_SC_MQ_PRIO_MAX) возвращает 32768, но в POSIX.1 требуется реализация поддержки
       только диапазона приоритетов от 0 до 31; некоторые реализации предоставляют только этот диапазон.

       Далее в разделе описываются особенности реализации очередей сообщений POSIX в Linux.

   Библиотечные интерфейсы и системные вызовы
       В  большинстве  случаев,  перечисленные  выше библиотечные интерфейсы mq_*() реализуются поверх системных
       вызовов с теми же именами. Исключения из этого правила перечислены в следующей таблице:
              Библиотечный интерфейс   Системный вызов
              mq_close(3)              close(2)
              mq_getattr(3)            mq_getsetattr(2)
              mq_notify(3)             mq_notify(2)
              mq_open(3)               mq_open(2)
              mq_receive(3)            mq_timedreceive(2)
              mq_send(3)               mq_timedsend(2)
              mq_setattr(3)            mq_getsetattr(2)
              mq_timedreceive(3)       mq_timedreceive(2)
              mq_timedsend(3)          mq_timedsend(2)
              mq_unlink(3)             mq_unlink(2)

   Версии
       POSIX message queues have been supported since Linux 2.6.6.  glibc support has been provided since  glibc
       2.3.4.

   Конфигурация ядра
       Поддержка  очередей  сообщений  POSIX  включается  параметром  настройки ядра CONFIG_POSIX_MQUEUE. Данный
       параметр включён по умолчанию.

   Устойчивость
       Очереди сообщений POSIX располагаются в ядре.  Пока  очередь  не  удалёна  с  помощью  mq_unlink(3),  она
       остаётся в системе до её выключения.

   Компоновка
       Программы,  в  которых  используется  программный  интерфейс  очереди  сообщений  POSIX, для компоновки с
       библиотекой реального времени librt должны компилироваться с помощью cc -lrt.

   Интерфейс /proc
       Для ограничения потребления очередями сообщений POSIX памяти ядра и задания атрибутов  по  умолчанию  для
       новых очередей сообщений, можно использовать следующие интерфейсы:

       /proc/sys/fs/mqueue/msg_default (начиная с Linux 3.5)
              This  file  defines  the  value used for a new queue's mq_maxmsg setting when the queue is created
              with a call to mq_open(3)  where attr is specified as NULL.  The default value for  this  file  is
              10.   The  minimum  and  maximum  are  as  for /proc/sys/fs/mqueue/msg_max.  A new queue's default
              mq_maxmsg value will be the smaller of msg_default and msg_max.  Before Linux 2.6.28, the  default
              mq_maxmsg  was  10;  from  Linux  2.6.28  to  Linux 3.4, the default was the value defined for the
              msg_max limit.

       /proc/sys/fs/mqueue/msg_max
              This file can be used to view and change the ceiling value for the maximum number of messages in a
              queue.  This value acts as a ceiling on the attr->mq_maxmsg argument  given  to  mq_open(3).   The
              default  value  for  msg_max  is  10.  The minimum value is 1 (10 before Linux 2.6.28).  The upper
              limit is HARD_MSGMAX.  The msg_max limit is ignored for privileged  processes  (CAP_SYS_RESOURCE),
              but the HARD_MSGMAX ceiling is nevertheless imposed.

              Определение HARD_MSGMAX изменялось в разных версиях ядра следующим образом:

              •  Up to Linux 2.6.32: 131072 / sizeof(void *)

              •  Linux 2.6.33 to Linux 3.4: (32768 * sizeof(void *) / 4)

              •  Начиная с Linux 3.5: 65536

       /proc/sys/fs/mqueue/msgsize_default (начиная с Linux 3.5)
              This  file  defines  the value used for a new queue's mq_msgsize setting when the queue is created
              with a call to mq_open(3)  where attr is specified as NULL.  The default value for  this  file  is
              8192   (bytes).    The  minimum  and  maximum  are  as  for  /proc/sys/fs/mqueue/msgsize_max.   If
              msgsize_default exceeds msgsize_max, a new queue's default  mq_msgsize  value  is  capped  to  the
              msgsize_max  limit.   Before  Linux  2.6.28, the default mq_msgsize was 8192; from Linux 2.6.28 to
              Linux 3.4, the default was the value defined for the msgsize_max limit.

       /proc/sys/fs/mqueue/msgsize_max
              This file can be used to view and change the ceiling on the maximum message size.  This value acts
              as a ceiling on the  attr->mq_msgsize  argument  given  to  mq_open(3).   The  default  value  for
              msgsize_max  is 8192 bytes.  The minimum value is 128 (8192 before Linux 2.6.28).  The upper limit
              for msgsize_max has varied across kernel versions:

              •  До Linux 2.6.28 верхний предел был равен INT_MAX.

              •  From Linux 2.6.28 to Linux 3.4, the limit is 1,048,576.

              •  Начиная с Linux 3.5 предел равен 16777216 (HARD_MSGSIZEMAX).

              Предел msgsize_max игнорируется для привилегированных процессов (CAP_SYS_RESOURCE), но, начиная  с
              Linux 3.5, накладывается ограничение HARD_MSGSIZEMAX.

       /proc/sys/fs/mqueue/queues_max
              Данный  файл  можно  использовать  для  просмотра и изменения системного ограничения на количество
              сообщений в очереди. Значение queues_max  по  умолчанию  равно  256.  У  queues_max  нет  верхнего
              предела;  привилегированные  процессы  (CAP_SYS_RESOURCE) могут превышать ограничение (но смотрите
              ДЕФЕКТЫ).

   Ограничение ресурса
       Ограничение ресурса RLIMIT_MSGQUEUE, накладываемое на количество пространства, которое могут  занять  все
       очереди сообщений, принадлежащие процессу с реальным пользовательским ID, описано в getrlimit(2).

   Монтирование файловой системы очереди сообщений
       В Linux очереди сообщений создаются в виртуальной файловой системе (другие реализации могут делать также,
       но, вероятно, по-другому). Данная файловая система может быть смонтирована (суперпользователем) с помощью
       команд:

           # mkdir /dev/mqueue
           # mount -t mqueue none /dev/mqueue

       Закрепляющий бит устанавливается на каталог назначения автоматически.

       После  примонтирования  файловой  системы  очередь  сообщений  в системе можно просматривать и изменять с
       помощью команд как с обычными файлами (например, ls(1) и rm(1)).

       Содержимое каждого файла в каталоге состоит  из  одной  строки,  в  которой  представлена  информация  об
       очереди:

           $ cat /dev/mqueue/mymq
           QSIZE:129     NOTIFY:2    SIGNO:0    NOTIFY_PID:8260

       Эти поля означают следующее:

       QSIZE  Количество байтов данных во всех сообщениях очереди (но смотрите ДЕФЕКТЫ).

       NOTIFY_PID
              Если  это значение не равно нулю, то процесс с данным PID использовал mq_notify(3) для регистрации
              асинхронных уведомлений о сообщениях, а оставшиеся поля описывают как производится уведомление.

       NOTIFY Способ уведомления: 0 — SIGEV_SIGNAL; 1 — SIGEV_NONE; 2 — SIGEV_THREAD.

       SIGNO  Номер сигнала, который будет использован для SIGEV_SIGNAL.

   Реализация дескрипторов очереди сообщений в Linux
       В Linux дескриптор очереди сообщений представляет собой файловый дескриптор (в POSIX не  требуется  этого
       от  реализации).  Это  означает, что за дескриптором очереди сообщений можно следить с помощью select(2),
       poll(2) или epoll(7). Это является непереносимым свойством.

       Флаг close-on-exec (смотрите open(2)) устанавливается автоматически на файловом дескрипторе, возвращаемом
       mq_open(2).

   Пространства имён IPC
       Обсуждение связи объектов очереди сообщений POSIX с пространствами IPC смотрите в ipc_namespaces(7).

ПРИМЕЧАНИЯ

       Очереди сообщений System V (msgget(2), msgsnd(2), msgrcv(2) и т. д.) — более старый программный интерфейс
       обмена сообщениями между процессами. Очереди сообщений POSIX  имеют  более  проработанный  интерфейс  чем
       очереди  сообщений  System  V;  с  другой  стороны,  очереди сообщений POSIX не так широко распространены
       (особенно в старых системах) чем очереди сообщений System V.

       Linux does not currently (Linux 2.6.26) support the use of access control lists (ACLs) for POSIX  message
       queues.

ОШИБКИ

       Since  Linux  3.5  to  Linux 3.14, the kernel imposed a ceiling of 1024 (HARD_QUEUESMAX)  on the value to
       which the queues_max limit could be raised, and the ceiling was enforced even for  privileged  processes.
       This  ceiling  value  was  removed  in Linux 3.14, and patches to stable Linux 3.5.x to Linux 3.13.x also
       removed the ceiling.

       Первоначально реализованное (и описанное) поле QSIZE показывало общее количество (пользовательских)  байт
       всех  сообщений в очереди. Некоторые изменения в Linux 3.5 непреднамеренно изменили это поведение, и поле
       стало также включать байты издержек ядра, которые требуются для хранения сообщений в  очереди.  Это  было
       исправлено  в  Linux  4.2  (и  более  ранних  стабильных  ядрах),  и  теперь снова считаются байты только
       пользовательских сообщений в очереди.

ПРИМЕРЫ

       Пример использования функций работы с очередью сообщений смотрите в mq_notify(3).

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

       getrlimit(2), mq_getsetattr(2), poll(2), select(2), mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3),
       mq_receive(3), mq_send(3), mq_unlink(3), epoll(7), namespaces(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  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                   mq_overview(7)