Provided by: manpages-ru-dev_4.27.0-1_all bug

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

       mq_notify - включает уведомление при поступлении сообщения

БИБЛИОТЕКА

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

ОБЗОР

       #include <mqueue.h>
       #include <signal.h>           /* Definition of SIGEV_* constants */

       int mq_notify(mqd_t mqdes, const struct sigevent *sevp);

ОПИСАНИЕ

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

       The  sevp  argument is a pointer to a sigevent structure.  For the definition and general details of this
       structure, see sigevent(3type).

       Если sevp не равен null, то mq_notify() регистрирует  вызывающий  процесс  для  получения  уведомлений  о
       сообщениях. В поле sigev_notify структуры sigevent, на которую указывает sevp, задаётся способ выполнения
       уведомления. Это поле может содержать одно из следующих значений:

       SIGEV_NONE
              «Нулевое»  уведомление:  хотя  вызывающий процесс и регистрируется как уведомляемый, при появлении
              сообщения уведомление не будет отправлено.

       SIGEV_SIGNAL
              Notify the process by sending the signal  specified  in  sigev_signo.   See  sigevent(3type)   for
              general  details.   The  si_code  field  of  the  siginfo_t structure will be set to SI_MESGQ.  In
              addition, si_pid will be set to the PID of the process that sent the message, and si_uid  will  be
              set to the real user ID of the sending process.

       SIGEV_THREAD
              Upon  message  delivery,  invoke  sigev_notify_function  as if it were the start function of a new
              thread.  See sigevent(3type)  for details.

       Только один процесс может быть зарегистрирован, чтобы получить уведомление из очереди сообщений.

       Если sevp равно NULL и вызывающий процесс  уже  зарегистрирован  принимать  сообщения  для  этой  очереди
       сообщений,  то  регистрация  удаляется; после этого другой процесс может зарегистрироваться для получения
       уведомлений о сообщениях в этой очереди.

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

       Если другой процесс или нить ожидают чтения сообщения из пустой очереди с помощью mq_receive(3),  то  все
       регистрации по уведомлению игнорируются; сообщение доставляется процесс или нити вызвавшей mq_receive(3),
       и регистрация уведомления о сообщении остаётся как была.

       Уведомление выполняется один раз: после доставки уведомления регистрация удаляется и другой процесс может
       зарегистрироваться для уведомления. Если уведомлённый процесс хочет получить следующее уведомление, то он
       может  использовать  mq_notify()  для  запроса  уведомления  в  дальнейшем.  Это  должно  быть сделано до
       исчезновения всех непрочитанных сообщений из очереди (переключение очереди в неблокирующий режим  полезно
       для опустошения очереди сообщений без блокировки, если очередь пуста).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При  успешном  выполнении  mq_notify()  возвращает  0; при ошибке возвращает -1, а в errno помещается код
       ошибки.

ОШИБКИ

       EBADF  В mqdes размещён некорректный дескриптор очереди сообщений.

       EBUSY  Другой процесс уже зарегистрировался, чтобы получать уведомление из этой очереди сообщений.

       EINVAL Значение  sevp->sigev_notify  содержит  недопустимое  значение;   или   sevp->sigev_notify   равно
              SIGEV_SIGNAL и sevp->sigev_signo не содержит корректного номера сигнала.

       ENOMEM Недостаточно памяти.

       В  POSIX.1-2008  сказано,  что  реализация  может  генерировать  ошибку  EINVAL,  если sevp равно NULL, и
       вызывающий ещё не зарегистрирован для получения уведомлений из очереди mqdes.

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌─────────────────────────────────────────────────────────────────────┬──────────────────────┬──────────┐
       │ ИнтерфейсАтрибутЗначение │
       ├─────────────────────────────────────────────────────────────────────┼──────────────────────┼──────────┤
       │ mq_notify()                                                         │ Безвредность в нитях │ MT-Safe  │
       └─────────────────────────────────────────────────────────────────────┴──────────────────────┴──────────┘

ВЕРСИИ

   Отличия между библиотекой C и ядром
       В glibc библиотечная функция mq_notify() реализована на основе системного вызова с тем  же  именем.  Если
       sevp  равно  NULL  или  задаёт  механизм  уведомления  не  SIGEV_THREAD, то библиотечная функция напрямую
       вызывает системный вызов. Большая часть реализации SIGEV_THREAD располагается внутри библиотеки, а  не  в
       ядре  (эта  необходимость  возникает  из-за  того,  что нить, вовлечённая в обработку уведомления, должна
       управляться в библиотечной реализации C нитей  POSIX).  В  реализации  задействуется  неструктурированный
       сокет netlink(7) и создаётся новая нить для каждого уведомления, доставляемого процессу.

СТАНДАРТЫ

       POSIX.1-2008.

ИСТОРИЯ

       POSIX.1-2001.

ПРИМЕРЫ

       В  следующей программе показана регистрация запроса уведомления для очереди сообщений с именем, указанном
       в аргументе командной строки. Уведомление выполняется создаваемой нитью. Нить выполняет функцию,  которая
       читает одно сообщение из очереди и завершает процесс.

   Исходный код программы
       #include <mqueue.h>
       #include <pthread.h>
       #include <signal.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       static void                     /* Thread start function */
       tfunc(union sigval sv)
       {
           struct mq_attr attr;
           ssize_t nr;
           void *buf;
           mqd_t mqdes = *((mqd_t *) sv.sival_ptr);

           /* Determine max. msg size; allocate buffer to receive msg */

           if (mq_getattr(mqdes, &attr) == -1)
               handle_error("mq_getattr");
           buf = malloc(attr.mq_msgsize);
           if (buf == NULL)
               handle_error("malloc");

           nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL);
           if (nr == -1)
               handle_error("mq_receive");

           printf("Read %zd bytes from MQ\n", nr);
           free(buf);
           exit(EXIT_SUCCESS);         /* Terminate the process */
       }

       int
       main(int argc, char *argv[])
       {
           mqd_t mqdes;
           struct sigevent sev;

           if (argc != 2) {
               fprintf(stderr, "Usage: %s <mq-name>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           mqdes = mq_open(argv[1], O_RDONLY);
           if (mqdes == (mqd_t) -1)
               handle_error("mq_open");

           sev.sigev_notify = SIGEV_THREAD;
           sev.sigev_notify_function = tfunc;
           sev.sigev_notify_attributes = NULL;
           sev.sigev_value.sival_ptr = &mqdes;   /* Arg. to thread func. */
           if (mq_notify(mqdes, &sev) == -1)
               handle_error("mq_notify");

           pause();    /* Process will be terminated by thread function */
       }

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

       mq_close(3),   mq_getattr(3),   mq_open(3),   mq_receive(3),  mq_send(3),  mq_unlink(3),  mq_overview(7),
       sigevent(3type)

ПЕРЕВОД

       Русский  перевод  этой   страницы   руководства   разработал(и)   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                  15 июня 2024 г.                                    mq_notify(3)