Linux repositories inspector

mq_receive(3) - Russkiy

Linux
2017-09-15
Aliases: mq_timedreceive(2), mq_timedreceive(2), mq_timedreceive(2), mq_timedreceive(2), mq_timedreceive(2), mq_timedreceive(2), mq_timedreceive(3), mq_timedreceive(3), mq_timedreceive(3), mq_timedreceive(3), mq_timedreceive(3), mq_timedreceive(3)

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages-dev

Manual pages about using GNU/Linux for development

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

mq_receive, mq_timedreceive - выбирают сообщения из очереди сообщений

ОБЗОР

#include <mqueue.h>

ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio);
#include <time.h> #include <mqueue.h>
ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout);
Компонуется при указании параметра -lrt.
Требования макроса тестирования свойств для 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() действует подобно mq_receive(), за исключением того, что если очередь пуста и в описании очереди сообщений не установлен флаг O_NONBLOCK, то abs_timeout указывает на структуру, которой задаётся длительность блокировки вызова. Это абсолютное значение задаётся в секундах и наносекундах начиная с Эпохи, 1970-01-01 00:00:00 +0000 (UTC) в структуре вида:
struct timespec {
time_t tv_sec; /* секунды */
long tv_nsec; /* наносекунды */ };
Если сообщения нет и вышло время ожидания на момент вызова, то 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() — библиотечной функцией, реализованной на основе этого системного вызова:
⇧ Top