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