mq_timedsend(), mq_timedsend_monotonic()

Отправить сообщение в очередь сообщений

Прототип:

#include <mqueue.h>
#include <time.h>
int mq_timedsend( mqd_t mqdes,
const char *msg_ptr,
size_t msg_len,
unsigned int msg_prio,
const struct timespec *abs_timeout );
int mq_timedsend_monotonic( mqd_t mqdes,
const char *msg_ptr,
size_t msg_len,
unsigned int msg_prio,
const struct timespec *abs_timeout );

Аргументы:

mqdes
Дескриптор очереди сообщений, в которую необходимо поместить сообщение, возвращённый функцией mq_open().
msg_ptr
Указатель на данные сообщения.
msg_len
Размер буфера в байтах.
msg_prio
Приоритет сообщения в диапазоне от 0 до (MQ_PRIO_MAX - 1).
abs_timeout
Указатель на структуру struct timespec, определяющую абсолютное время (время, не относительное к текущему времени) ожидания, прежде чем функция прекратит попытки получить сообщения.

Библиотека:

Описание:

Функция mq_timedsend() помещает сообщение размером msg_len, указатель на которое задаётся параметром msg_ptr, в очередь, заданную параметром mqdes. Новое сообщение имеет приоритет, заданный параметром msg_prio. Функция mq_timedsend_monotonic() является расширением ЗОСРВ «Нейтрино», она аналогична mq_timedsend(), но использует CLOCK_MONOTONIC, поэтому на время ожидания не влияют изменения системного времени.


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

Очередь устанавливается в порядке приоритета, а в пределах одного и того же приоритета - в порядке FIFO.

Если количество элементов в заданной очереди равно значению mq_maxmsg для этой очереди, а также флаг O_NONBLOCK не установлен (в параметре oflag при вызове функции mq_open()), вызов mq_timedsend() блокируется. Он разблокируется, когда в очереди появляется место для отправки данного сообщения. Если для данной очереди заблокировано более одного вызова mq_timedsend(), а также становится доступным место для отправки сообщения, разблокируется вызов mq_timedsend() с сообщением, имеющим наивысший приоритет.

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

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

-1
Возникла ошибка. Код ошибки записан в errno.
≠-1
Успешное завершение.

Коды ошибок:

EAGAIN
Флаг O_NONBLOCK установлен при открытии очереди и эта очередь заполнена.
EBADF
Параметр mqdes не представляет собой допустимый дескриптор очереди сообщений, или очередь mqdes не открыта для записи.
EINTR
Вызов прерван сигналом.
EINVAL
Верно одно из следующего:
EMSGSIZE
Значение параметра msg_len больше, чем значение msgsize для заданной очереди.
ETIMEDOUT
Превышено значение времени ожидания.

Примеры:

См. примеры для mq_timedreceive().

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

mq_timedsend() — POSIX 1003.1 Message Passing; mq_timedsend_monotonic() — ЗОСРВ «Нейтрино»

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

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

mq_close(), mq_open(), mq_receive(), mq_send(), mq_timedreceive(), struct timespec

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




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