MsgSendv(), MsgSendv_r()

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

Прототип:

#include <sys/neutrino.h>
int MsgSendv( int coid,
const iov_t *siov,
int sparts,
const iov_t *riov,
int rparts );
int MsgSendv_r( int coid,
const iov_t *siov,
int sparts,
const iov_t *riov,
int rparts );

Аргументы:

coid
Идентификатор соединения, установленного для отправки сообщений с каналом сервера с помощью функции ConnectAttach() или name_open().
siov
Массив объектов iov_t, которые содержат отправляемое сообщение.
sparts
Количество элементов массива siov.
riov
Массив объектов iov_t, в которых функция будет сохранять ответное сообщение.
rparts
Количество элементов массива riov.

Библиотека:

libc

Описание:

Функции MsgSendv() и MsgSendv_r() отправляют сообщение в канал, идентифицируемый соединением coid.

Данные функции идентичны за исключением способа возврата ошибок.

Количество реально передаваемых байт имеет значение меньшее из заданных и отправителем, и получателем. Отправляемые данные не могут переполнять приёмный буфер, предоставленный сервером. Данные, получаемые при ответе сервера, не могут переполнять буфер, предоставленный клиентом для ответа.

Поток-отправитель становится заблокированным, пока не получит ответ от получателя. Если поток-получатель находится в состоянии RECEIVE-блокировки на канале, то передача данных в его адресное пространство происходит немедленно, поток-получатель разблокируется и становится готов к выполнению. При этом поток-отправитель становится REPLY-блокированным. В случае, если нет потоков, ожидающих сообщения на канале, поток-отправитель становится SEND-блокированным и помещается в очередь (возможно, с другими потоками). В этом случае реальной передачи данных не происходит, пока принимающий поток не вызовет функцию MsgReceive*(). В этот момент поток-отправитель станет REPLY-блокированным.

Широко распространен подход, когда сообщение состоит из двух частей: фиксированного заголовка и буфера с данными. Функция MsgSendv() объединяет данные из этих буферов в единую логическую последовательность данных, образующих сообщение, и передает получателю (потоку-серверу). Нет необходимости на стороне сервера задавать такое же количество или размер буферов, какие заданы у клиента. Переданные данные заполнят те буферы, которые предоставит сервер. Это применимо также к ответному сообщению от сервера к клиенту.


Note: Эффективный приоритет потока-получателя может измениться (в значение приоритета потока-отправителя) при отправке ему сообщения. Наследование приоритетов является поведением по умолчанию и может быть изменено с помощью соответствующего флага при вызове функции создания канала.

MsgSendsv() является точкой завершения потока для функции ThreadCancel(); MsgSendsvnc() точкой завершения потока не является.

Состояния блокировки:

STATE_SEND
Сообщение было отправлено, но не получено. Если какой-либо поток ждет сообщений на канале, то это состояние пропускается и поток-отправитель сразу переходит в состояние STATE_REPLY.
STATE_REPLY
Сообщение было получено, но ещё не получен ответ. Отправитель переходит в это состояние сразу или из состояния STATE_SEND.

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

MsgSendv()
Успешное завершение
Значение аргумента status, заданное сервером при вызове функции MsgReply*().
-1
Возникла ошибка (устанавливается errno), либо сервер вызвал MsgError*() и задал значение ошибки с помощью параметра ( errno, передаваемого в MsgError()).
MsgSendv_r()
Успешное завершение
Значение аргумента status, заданное сервером при вызове функции MsgReply*().
negative value
Возникла ошибка ( errno не выставляется, возвращается отрицательная величина, заданная в секции "Коды ошибок") или сервер вызвал MsgError*() ( errno не выставляется, возвращается отрицательная величина параметра, переданного в MsgError()).

Коды ошибок:

EBADF
Соединение coid не существует или отключено от канала. Канал может быть уничтожен сервером или сетевым менеджером, если он не может обработать большое количество запросов.
EFAULT
Ошибка при попытке доступа ядра к предоставленным буферам. Это может произойти при приёме сообщения или при ответе.
EHOSTDOWN
Узел получателя не доступен (например, произошла ошибка при пересылке сообщения через Qnet).
EHOSTUNREACH
Взаимодействие с удалённым узлом невозможно (например, через Qnet).
EINTR
Функция была прервана сигналом.
EOVERFLOW
Сумма размеров буферов в массиве siov превышает значение INT_MAX.
ESRCH
Сервер завершил работу пока поток-отправитель был в состоянии SEND-блокирован или REPLY-блокирован.
ESRVRFAULT
Ошибка при попытке ядра получить доступ к предоставленным сервером буферам.
ETIMEDOUT
Функция прервана по тайм-ауту ядра. См. TimerTimeout().

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

ЗОСРВ «Нейтрино»

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

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

iov_t, ConnectAttach(), MsgError(), MsgReceive(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgSend(), MsgSendnc(), MsgSendPulse(), MsgSendsv(), MsgSendsvnc(), MsgSendvnc(), MsgSendvs(), MsgSendvsnc(), name_open(), ThreadCancel(), TimerTimeout()




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