mq_receive, mq_timedreceive -
выбирают
сообщения
из очереди
сообщений
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);
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 <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]