Provided by: manpages-ru-dev_4.19.0-7_all
ИМЯ
mq_receive, mq_timedreceive - выбирают сообщения из очереди сообщений
LIBRARY
Real-time library (librt, -lrt)
СИНТАКСИС
#include <mqueue.h> ssize_t mq_receive(mqd_t mqdes, char msg_ptr[.msg_len], size_t msg_len, unsigned int *msg_prio); #include <time.h> #include <mqueue.h> ssize_t mq_timedreceive(mqd_t mqdes, char *restrict msg_ptr[.msg_len], size_t msg_len, unsigned int *restrict msg_prio, const struct timespec *restrict abs_timeout); Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)): mq_timedreceive(): _POSIX_C_SOURCE >= 200112L
ОПИСАНИЕ
Функция mq_receive() удаляет самое старое сообщение с наивысшим приоритетом из очереди сообщений, на которою указывает дескриптор очереди сообщений mqdes, и помещает сообщение в буфер, на который указывает msg_ptr. В аргументе msg_len задаётся размер буфера, на который указывает msg_ptr; он должен быть больше или равен атрибуту очереди mq_msgsize (смотрите mq_getattr(3)). Если msg_prio не равно NULL, то указанный в нём буфер используется для возврата приоритета, связанного с полученным сообщением. Если очередь пуста, то по умолчанию функция mq_receive() блокирует выполнение до тех пор, показ не поступит сообщение или вызов не будет прерван обработчиком сигнала. Если в описании очереди сообщений включён флаг O_NONBLOCK, то вызов завершается сразу же с ошибкой EAGAIN. mq_timedreceive() behaves just like mq_receive(), except that if the queue is empty and the O_NONBLOCK flag is not enabled for the message queue description, then abs_timeout points to a structure which specifies how long the call will block. This value is an absolute timeout in seconds and nanoseconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC), specified in a timespec(3) structure. Если сообщения нет и вышло время ожидания на момент вызова, то mq_timedreceive() сразу же завершается.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении mq_receive() и mq_timedreceive() возвращается количество байт в полученном сообщении; при ошибке возвращается -1 и в errno записывается значение ошибки.
ОШИБКИ
EAGAIN Очередь была пуста и в описании очереди сообщений, на которое ссылается mqdes, указан флаг O_NONBLOCK. EBADF В mqdes указан некорректный или не открытый на чтение дескриптор. EINTR Вызов был прерван обработчиком сигнала; смотрите signal(7). EINVAL Вызов бы заблокировался и в abs_timeout указано некорректное значение, так как tv_sec меньше нуля или tv_nsec меньше нуля или более 1000 миллионов. EMSGSIZE msg_len меньше чем свойство очереди сообщений, mq_msgsize. ETIMEDOUT Истёк период ожидания в вызове, раньше появления возможности передачи сообщения.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7). ┌───────────────────────────────────────────────────────┬──────────────────────┬──────────┐ │Интерфейс │ Атрибут │ Значение │ ├───────────────────────────────────────────────────────┼──────────────────────┼──────────┤ │mq_receive(), mq_timedreceive() │ Безвредность в нитях │ MT-Safe │ └───────────────────────────────────────────────────────┴──────────────────────┴──────────┘
СТАНДАРТЫ
POSIX.1-2001, POSIX.1-2008.
ЗАМЕЧАНИЯ
В Linux, mq_receive() является системным вызовом, а mq_timedreceive() — библиотечной функцией, реализованной на основе этого системного вызова:
СМ. ТАКЖЕ
mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_send(3), mq_unlink(3), timespec(3), mq_overview(7), time(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⟩.