Отправить сообщение (без точки завершения потока)
#include <sys/neutrino.h>int MsgSendvnc( int coid,const iov_t *siov,int sparts,const iov_t *riov,int rparts );int MsgSendvnc_r( int coid,const iov_t *siov,int sparts,const iov_t *riov,int rparts );
libc
Функции MsgSendvnc() и MsgSendvnc_r() отправляют сообщение в канал, идентифицируемый соединением coid.
Данные функции идентичны за исключением способа возврата ошибок.
Количество реально передаваемых байт имеет значение меньшее из заданных и отправителем, и получателем. Отправляемые данные не могут переполнять приёмный буфер, предоставленный сервером. Данные, получаемые при ответе сервера, не могут переполнять буфер, предоставленный клиентом для ответа.
Поток-отправитель становится заблокированным, пока не получит ответ от получателя. Если поток-получатель находится в состоянии RECEIVE-блокировки на канале, то передача данных в его адресное пространство происходит немедленно, поток-получатель разблокируется и становится готов к выполнению. При этом поток-отправитель становится REPLY-блокированным. В случае, если нет потоков, ожидающих сообщения на канале, поток-отправитель становится SEND-блокированным и помещается в очередь (возможно, с другими потоками). В этом случае реальной передачи данных не происходит, пока принимающий поток не вызовет функцию MsgReceive*(). В этот момент поток-отправитель станет REPLY-блокированным.
Широко распространен подход, когда сообщение состоит из двух частей: фиксированного заголовка и буфера с данными. Функция MsgSendvnc() объединяет данные из этих буферов в единую логическую последовательность данных, образующих сообщение, и передает получателю (потоку-серверу). Нет необходимости на стороне сервера задавать такое же количество или размер буферов, какие заданы у клиента. Переданные данные заполнят те буферы, которые предоставит сервер. Это применимо также к ответному сообщению от сервера к клиенту.
![]() | Эффективный приоритет потока-получателя может измениться (в значение приоритета потока-отправителя) при отправке ему сообщения. Наследование приоритетов является поведением по умолчанию и может быть изменено с помощью соответствующего флага при вызове функции создания канала. |
MsgSendv() является точкой завершения для функции ThreadCancel(); MsgSendvnc() точкой завершения не является.
STATE_REPLY
. STATE_SEND
.
INT_MAX
. ЗОСРВ «Нейтрино»
iov_t, ConnectAttach(), MsgError(), MsgReceive(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgSend(), MsgSendnc(), MsgSendPulse(), MsgSendsv(), MsgSendsvnc(), MsgSendv(), MsgSendvs(), MsgSendvsnc(), name_open(), TimerTimeout()
Предыдущий раздел: Описание API системной библиотеки