- bullseye-backports 4.18.1-1~bpo11+1
- testing 4.18.1-1
- unstable 4.18.1-1
MQ_SEND(3) | Руководство программиста Linux | MQ_SEND(3) |
ИМЯ¶
mq_send, mq_timedsend - отправляет сообщение в очередь сообщений
СИНТАКСИС¶
#include <mqueue.h>
int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio);
#include <time.h> #include <mqueue.h>
int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout);
Компонуется при указании параметра -lrt.
mq_timedsend():
ОПИСАНИЕ¶
Функция 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() действует подобно mq_send(), за исключением того, что если очередь пуста и в описании очереди сообщений не установлен флаг O_NONBLOCK, то abs_timeout указывает на структуру, в которой задаётся длительность блокировки вызова. Это абсолютное значение задаётся в секундах и наносекундах начиная с Эпохи, 1970-01-01 00:00:00 +0000 (UTC), в структуре вида:
struct timespec {
time_t tv_sec; /* секунды */
long tv_nsec; /* наносекунды */ };
Если очередь сообщений полна и вышло время ожидания на момент вызова, то 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), mq_overview(7), time(7)
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Alexey <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Малянов Евгений Викторович <maljanow@outlook.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
13 августа 2020 г. | Linux |