.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2006 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MQ_OVERVIEW 7 "9 июня 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ mq_overview \- обзор очередей сообщений POSIX .SH ОПИСАНИЕ Очереди сообщений POSIX позволяют процессам обмениваться данными в виде сообщений. Данный программный интерфейс отличается от используемого в очередях сообщений System V (\fBmsgget\fP(2), \fBmsgsnd\fP(2), \fBmsgrcv\fP(2), etc.), но предоставляет схожие возможности. .PP Очереди сообщений создаются и открываются с помощью \fBmq_open\fP(3); эта функция возвращает \fIдескриптор очереди сообщений\fP (\fImqd_t\fP), который используется в последующих вызовах для ссылки на открытую очередь сообщений. Каждая очередь сообщений описывается именем в виде \fI/некое_имя\fP; оно представляет собой строку с null в конце и длиной до \fBNAME_MAX\fP (т. е., 255) символов, состоящую из начальной косой черты, одного и более символа (любого, кроме косой черты). Два процесса могут работать через одну очередь, если укажут одинаковое имя в \fBmq_open\fP(3). .PP Сообщения передаются в и из очереди с помощью функций \fBmq_send\fP(3) и \fBmq_receive\fP(3). Когда процесс прекращает использовать очередь, он закрывает её с помощью функции \fBmq_close\fP(3), и если очередь больше не нужна, то она может быть удалена с помощью функции \fBmq_unlink\fP(3). Атрибуты очереди можно получить и (в некоторых случаях) изменить с помощью функций \fBmq_getattr\fP(3) и \fBmq_setattr\fP(3). Процесс может запросить асинхронное уведомление о поступлении сообщения в пустую очередь с помощью функции \fBmq_notify\fP(3). .PP Дескриптор очереди сообщений — это ссылка на \fIоткрытое описание очереди сообщений\fP (смотрите \fBopen\fP(2)). После вызова \fBfork\fP(2) потомок наследует копии дескрипторов очередей сообщений родителя и эти дескрипторы ссылаются на те же открытые описания очередей сообщений родителя. Соответствующие дескрипторы очередей сообщений двух процессов используют общий флаг (\fImq_flags\fP), который связан с открытым описанием очереди сообщений. .PP У каждого сообщения есть \fIприоритет\fP, и сначала в принимающий процесс всегда доставляются сообщения наивысшим приоритетом. Диапазон приоритетов сообщений: 0 (низший) — \fIsysconf(_SC_MQ_PRIO_MAX)\ \-\ 1\fP (высший). В Linux, \fIsysconf(_SC_MQ_PRIO_MAX)\fP возвращает 32768, но в POSIX.1 требуется реализация поддержки только диапазона приоритетов от 0 до 31; некоторые реализации предоставляют только этот диапазон. .PP Далее в разделе описываются особенности реализации очередей сообщений POSIX в Linux. .SS "Библиотечные интерфейсы и системные вызовы" В большинстве случаев, перечисленные выше библиотечные интерфейсы \fBmq_*\fP() реализуются поверх системных вызовов с теми же именами. Исключения из этого правила перечислены в следующей таблице: .RS .TS lB lB l l. Библиотечный интерфейс Системный вызов 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) .TE .RE .SS Версии Поддержка очередей сообщений POSIX началась в ядре Linux версии 2.6.6. Поддержка в glibc предоставляется с версии 2.3.4. .SS "Конфигурация ядра" Поддержка очередей сообщений POSIX включается параметром настройки ядра \fBCONFIG_POSIX_MQUEUE\fP. Данный параметр включён по умолчанию. .SS Устойчивость Очереди сообщений POSIX располагаются в ядре. Пока очередь не удалёна с помощью \fBmq_unlink\fP(3), она остаётся в системе до её выключения. .SS Компоновка Программы, в которых используется программный интерфейс очереди сообщений POSIX, для компоновки с библиотекой реального времени \fIlibrt\fP должны компилироваться с помощью \fIcc \-lrt\fP. .SS "Интерфейс /proc" Для ограничения потребления очередями сообщений POSIX памяти ядра и задания атрибутов по умолчанию для новых очередей сообщений, можно использовать следующие интерфейсы: .TP \fI/proc/sys/fs/mqueue/msg_default\fP (начиная с Linux 3.5) В данном файле задаётся значение, которое используется для \fImq_maxmsg\fP в создаваемой новой очереди с помощью вызова \fBmq_open\fP(3) со значением \fIattr\fP равным NULL. Значение для этого файла по умолчанию равно 10. Минимальное и максимальные значение такие же как для \fI/proc/sys/fs/mqueue/msg_max\fP. Значение по умолчанию \fImq_maxmsg\fP у новой очереди будет меньше \fImsg_default\fP и \fImsg_max\fP. До Linux 2.6.28 значение \fImq_maxmsg\fP по умолчанию равнялось 10; с Linux 2.6.28 по Linux 3.4 значение по умолчанию равнялось ограничению \fImsg_max\fP. .TP \fI/proc/sys/fs/mqueue/msg_max\fP Данный файл можно использовать для просмотра и изменения значения максимального количества сообщений в очереди. Это значение служит верхним пределом для аргумента \fIattr\->mq_maxmsg\fP, указываемого в \fBmq_open\fP(3). Значение \fImsg_max\fP по умолчанию равно 10. Минимальное значение равно 1 (10 в ядрах до версии 2.6.28). Верхний предел равен \fBHARD_MSGMAX\fP. Ограничитель \fImsg_max\fP игнорируется для привилегированных процессов (\fBCAP_SYS_RESOURCE\fP), но, тем не менее, учитывается предел \fBHARD_MSGMAX\fP. .IP Определение \fBHARD_MSGMAX\fP изменялось в разных версиях ядра следующим образом: .RS .IP * 3 До Linux 2.6.32: \fI131072\ /\ sizeof(void\ *)\fP .IP * Linux 2.6.33 по 3.4: \fI(32768\ *\ sizeof(void\ *) / 4)\fP .IP * .\" commit 5b5c4d1a1440e94994c73dddbad7be0676cd8b9a Начиная с Linux 3.5: 65536 .RE .TP \fI/proc/sys/fs/mqueue/msgsize_default\fP (начиная с Linux 3.5) В данном файле задаётся значение, которое используется для \fImq_msgsize\fP в создаваемой новой очереди с помощью вызова \fBmq_open\fP(3) со значением \fIattr\fP равным NULL. Значение для этого файла по умолчанию равно 8192 (байты). Минимальное и максимальные значение такие же как для \fI/proc/sys/fs/mqueue/msgsize_max\fP. Если \fImsgsize_default\fP превышает \fImsgsize_max\fP, то значение \fImq_msgsize\fP для новой очереди по умолчанию ограничивается \fImsgsize_max\fP.До Linux 2.6.28 значение \fImq_msgsize\fP по умолчанию равнялось 8192; с Linux 2.6.28 по Linux 3.4 значение по умолчанию равнялось ограничению \fImsgsize_max\fP. .TP \fI/proc/sys/fs/mqueue/msgsize_max\fP Данный файл можно использовать для просмотра и изменения максимального размера сообщения. Это значение служит верхним пределом для аргумента \fIattr\->mq_msgsize\fP, указываемого в \fBmq_open\fP(3). Значение \fImsgsize_max\fP по умолчанию равно 8192 байта. Минимальное значение равно 128 (8192 в ядрах до версии 2.6.28). Верхний предел \fImsgsize_max\fP изменялся в разных версиях ядер следующим образом: .RS .IP * 3 До Linux 2.6.28 верхний предел был равен \fBINT_MAX\fP. .IP * С Linux 2.6.28 по 3.4 предел равен 1048576. .IP * Начиная с Linux 3.5 предел равен 16777216 (\fBHARD_MSGSIZEMAX\fP). .RE .IP Предел \fImsgsize_max\fP игнорируется для привилегированных процессов (\fBCAP_SYS_RESOURCE\fP), но, начиная с Linux 3.5, накладывается ограничение \fBHARD_MSGSIZEMAX\fP. .TP \fI/proc/sys/fs/mqueue/queues_max\fP Данный файл можно использовать для просмотра и изменения системного ограничения на количество сообщений в очереди. Значение \fIqueues_max\fP по умолчанию равно 256. У \fIqueues_max\fP нет верхнего предела; привилегированные процессы (\fBCAP_SYS_RESOURCE\fP) могут превышать ограничение (но смотрите ДЕФЕКТЫ). .SS "Ограничение ресурса" Ограничение ресурса \fBRLIMIT_MSGQUEUE\fP, накладываемое на количество пространства, которое могут занять все очереди сообщений, принадлежащие процессу с реальным пользовательским ID, описано в \fBgetrlimit\fP(2). .SS "Монтирование файловой системы очереди сообщений" В Linux очереди сообщений создаются в виртуальной файловой системе (другие реализации могут делать также, но, вероятно, по\-другому). Данная файловая система может быть смонтирована (суперпользователем) с помощью команд: .PP .in +4n .EX #\fB mkdir /dev/mqueue\fP #\fB mount \-t mqueue none /dev/mqueue\fP .EE .in .PP Закрепляющий бит устанавливается на каталог назначения автоматически. .PP После примонтирования файловой системы очередь сообщений в системе можно просматривать и изменять с помощью команд как с обычными файлами (например, \fBls\fP(1) и \fBrm\fP(1)). .PP Содержимое каждого файла в каталоге состоит из одной строки, в которой представлена информация об очереди: .PP .in +4n .EX $\fB cat /dev/mqueue/mymq\fP QSIZE:129 NOTIFY:2 SIGNO:0 NOTIFY_PID:8260 .EE .in .PP Эти поля означают следующее: .TP \fBQSIZE\fP Количество байтов данных во всех сообщениях очереди (но смотрите ДЕФЕКТЫ). .TP \fBNOTIFY_PID\fP Если это значение не равно нулю, то процесс с данным PID использовал \fBmq_notify\fP(3) для регистрации асинхронных уведомлений о сообщениях, а оставшиеся поля описывают как производится уведомление. .TP \fBNOTIFY\fP Способ уведомления: 0 — \fBSIGEV_SIGNAL\fP; 1 — \fBSIGEV_NONE\fP; 2 — \fBSIGEV_THREAD\fP. .TP \fBSIGNO\fP Номер сигнала, который будет использован для \fBSIGEV_SIGNAL\fP. .SS "Реализация дескрипторов очереди сообщений в Linux" В Linux дескриптор очереди сообщений представляет собой файловый дескриптор (в POSIX не требуется этого от реализации). Это означает, что за дескриптором очереди сообщений можно следить с помощью \fBselect\fP(2), \fBpoll\fP(2) или \fBepoll\fP(7). Это является непереносимым свойством. .PP Флаг close\-on\-exec (смотрите \fBopen\fP(2)) устанавливается автоматически на файловом дескрипторе, возвращаемом \fBmq_open\fP(2). .SS "Пространства имён IPC" Обсуждение связи объектов очереди сообщений POSIX с пространствами IPC смотрите в \fBipc_namespaces\fP(7). .SH ЗАМЕЧАНИЯ Очереди сообщений System V (\fBmsgget\fP(2), \fBmsgsnd\fP(2), \fBmsgrcv\fP(2) и т. д.) — более старый программный интерфейс обмена сообщениями между процессами. Очереди сообщений POSIX имеют более проработанный интерфейс чем очереди сообщений System V; с другой стороны, очереди сообщений POSIX не так широко распространены (особенно в старых системах) чем очереди сообщений System V. .PP В Linux (версия 2.6.26) пока нет поддержки использования списков контроля доступа (ACL) для очередей сообщений POSIX. .SH ДЕФЕКТЫ В Linux версиях с 3.5 по 3.14 ядро устанавливает верхний предел в 1024 (\fBHARD_QUEUESMAX\fP) на значение ограничения \fIqueues_max\fP и это влияет даже на привилегированные процессы. Это предельное значение было удалено в Linux 3.14, а также есть заплаты к стабильным ядрам версий с 3.5.x по 3.13.x для удаления этого предела. .PP .\" commit d6629859b36d .\" commit de54b9ac253787c366bbfb28d901a31954eb3511 Первоначально реализованное (и описанное) поле QSIZE показывало общее количество (пользовательских) байт всех сообщений в очереди. Некоторые изменения в Linux 3.5 непреднамеренно изменили это поведение, и поле стало также включать байты издержек ядра, которые требуются для хранения сообщений в очереди. Это было исправлено в Linux 4.2 (и более ранних стабильных ядрах), и теперь снова считаются байты только пользовательских сообщений в очереди. .SH ПРИМЕРЫ Пример использования функций работы с очередью сообщений смотрите в \fBmq_notify\fP(3). .SH "СМ. ТАКЖЕ" \fBgetrlimit\fP(2), \fBmq_getsetattr\fP(2), \fBpoll\fP(2), \fBselect\fP(2), \fBmq_close\fP(3), \fBmq_getattr\fP(3), \fBmq_notify\fP(3), \fBmq_open\fP(3), \fBmq_receive\fP(3), \fBmq_send\fP(3), \fBmq_unlink\fP(3), \fBepoll\fP(7), \fBnamespaces\fP(7) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .