mq_receive()

Получить сообщение из очереди

Прототип:

#include <mqueue.h>
ssize_t mq_receive( mqd_t mqdes,
char *msg_ptr,
size_t msg_len,
unsigned int *msg_prio );

Аргументы:

mqdes
Дескриптор очереди сообщений, из которой необходимо получить сообщение, возвращённый функцией mq_open().
msg_ptr
Указатель на буфер, в котором функция может хранить данные полученного сообщения.
msg_len
Размер сообщения для заданной очереди.
msg_prio
NULL, или указатель на место, куда функция сможет сохранить приоритет полученного сообщения.

Библиотека:

Описание:

Функция mq_receive() получает самое старое из сообщений с наивысшим приоритетом в очереди, заданной mqdes. Приоритет полученного сообщения помещается в место, на которое указывает msg_prio, сами данные — в место, на которое указывает msg_ptr, при этом возвращается размер полученного сообщения.


Note: Нейтрино поддерживает две реализации очередей сообщений: классическую реализацию и альтернативную, использующую асинхронные сообщения. Для дополнительной информации см. документацию по mq и mqueue.

Если вы вызываете функцию mq_receive() со значением параметра msg_len, меньшим, чем значение mq_msgsize для заданной очереди, то mq_receive() возвращает ошибку и устанавливает errno в EMSGSIZE.

Если в заданной очереди нет сообщений и O_NONBLOCK не установлен (в параметре oflag при вызове функции mq_open()), то вызов mq_receive() блокируется. Если несколько вызовов mq_receive() заблокированы для одной очереди, они разблокируются в порядке FIFO по мере поступления сообщений.

В классической реализации ( mqueue), вызов функции read() с дескриптором mqdes аналогичен вызову функции mq_receive() с параметром msg_prio, равным NULL.

Возвращаемое значение:

Размер сообщения, удалённого из очереди. Если возникла ошибка, функция возвращает -1, сообщения из очереди не удаляются, а код ошибки записывается в errno.

Коды ошибок:

EAGAIN
Был установлен флаг O_NONBLOCK, и в указанной очереди в настоящее время нет сообщений.
EBADF
Параметр mqdes не представляет собой допустимый дескриптор очереди сообщений, открытый для чтения.
EINTR
Вызов прерван сигналом.
EINVAL
Параметр msg_ptr не является допустимым указателем.
EMSGSIZE
Заданный msg_len меньше, чем mq_msgsize для данной очереди, или заданный msg_len слишком маленький для сообщения, которое может быть получено.

Классификация:

POSIX 1003.1 Message Passing

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

mq_close(), mq_open(), mq_send(), mq_timedreceive(), read()

mq, mqueue в Справочнике по Утилитам




Предыдущий раздел: Описание API системной библиотеки