ИМЯ

mq_send, mq_timedsend - отправляет сообщение в очередь сообщений

LIBRARY

Real-time library ( librt, -lrt)

СИНТАКСИС

#include <mqueue.h>
int mq_send(mqd_t mqdes, const char msg_ptr[.msg_len],
              size_t msg_len, unsigned int msg_prio);
#include <time.h>
#include <mqueue.h>
int mq_timedsend(mqd_t mqdes, const char msg_ptr[.msg_len],
              size_t msg_len, unsigned int msg_prio,
              const struct timespec *abs_timeout);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
mq_timedsend():
    _POSIX_C_SOURCE >= 200112L

ОПИСАНИЕ

Функция mq_send() добавляет сообщение, на которое указывает msg_ptr, в очередь сообщений, на которую ссылается дескриптор очереди сообщений mqdes. В аргументе msg_len задаётся длина сообщения, на которое указывает msg_ptr; эта длина должна быть меньше или равно атрибуту очереди mq_msgsize. Допускаются сообщения нулевой длины.
Значение аргумента msg_prio представляет собой неотрицательное целое, которым определяется приоритет этого сообщения. Сообщения помещаются в очередь в порядке уменьшения приоритета, самые новые сообщения с одинаковым приоритетом размещаются после старых с тем же приоритетом. Описание диапазона приоритета сообщения смотрите в mq_overview(7).
Если очередь сообщений заполнена (т. е., количество сообщений в очереди равно атрибуту очереди mq_maxmsg), то по умолчанию mq_send() блокируется до появления места для записи сообщения, или пока вызов не будет прерван обработчиком сигнала. Если в описании очереди сообщений включён флаг O_NONBLOCK, то вместо этого вызов сразу завершается с ошибкой EAGAIN.
mq_timedsend() behaves just like mq_send(), except that if the queue is full 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_timedsend() сразу же завершается.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении mq_send() и mq_timedsend() возвращается ноль; при ошибке возвращается -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_send(), mq_timedsend() Безвредность в нитях MT-Safe
 

СТАНДАРТЫ

POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ

В Linux mq_timedsend() является системным вызовом, а mq_send() — библиотечной функцией, реализованной на основе этого системного вызова:

СМ. ТАКЖЕ

mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(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]