MsgSendvsnc(), MsgSendvsnc_r()

Отправить сообщение (без точки завершения потока)

Прототип:

#include <sys/neutrino.h>
int MsgSendvsnc( int coid,
const iov_t *siov,
int sparts,
void *rmsg,
int rbytes );
int MsgSendvsnc_r( int coid,
const iov_t *siov,
int sparts,
void *rmsg,
int rbytes );

Аргументы:

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

Библиотека:

libc

Описание:

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

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

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

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


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

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

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

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

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

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

Коды ошибок:

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

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

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

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

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

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




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