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
The call was interrupted by a signal.
EOVERFLOW
The sum of the IOV lengths exceeds INT_MAX.
ESRCH
The server died while the calling thread was SEND-blocked or REPLY-blocked.
ESRVRFAULT
A fault occurred in a server's address space when accessing the server's message buffers.
ETIMEDOUT
A kernel timeout unblocked the call. See TimerTimeout().

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

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

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

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

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




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