Отправить сообщение
#include <sys/neutrino.h>int MsgSend( int coid,const void *smsg,int sbytes,void *rmsg,int rbytes );int MsgSend_r( int coid,const void *smsg,int sbytes,void *rmsg,int rbytes );
libc
Функции MsgSend() и MsgSend_r() отправляют сообщение в канал, идентифицируемый соединением coid.
Данные функции идентичны за исключением способа возврата ошибок.
Передаваемые данные не могут переполнить приёмный буфер, предоставленный получателем (фактический размер передаваемого сообщения - наименьшее из двух величин: размера отправляемого сообщения и размера буфера на стороне получателя).
Поток-отправитель становится заблокированным, пока не получит ответ от получателя. Если поток-получатель находится в состоянии RECEIVE-блокировки на канале, то передача данных в его адресное пространство происходит немедленно, поток-получатель разблокируется и становится готов к выполнению. При этом поток-отправитель становится REPLY-блокированным. В случае, если нет потоков, ожидающих сообщения на канале, поток-отправитель становится SEND-блокированным и помещается в очередь (возможно, с другими потоками). В этом случае реальной передачи данных не происходит, пока принимающий поток не вызовет функцию MsgReceive*(). В этот момент поток-отправитель станет REPLY-блокированным.
Эффективный приоритет потока-получателя может измениться (в значение приоритета потока-отправителя) при отправке ему сообщения. Наследование приоритетов является поведением по умолчанию и может быть изменено с помощью соответствующего флага при вызове функции создания канала. |
MsgSendsv() является точкой завершения потока для функции ThreadCancel(); MsgSendsvnc() точкой завершения потока не является.
STATE_REPLY
. STATE_SEND
. При отправке сообщения уделённому серверу (получателю) микроядро сначала передаёт его локальному сетевому менеджеру lsm-qnet.so
. Локальный сетевой менеджер взаимодействует с удалённым сетевым менеджером, в результате чего происходит доставка сообщения потоку-серверу.
Передача сообщения от удалённого сетевого менеджера на сервер осуществляется с помощью специальной неблокирующей передачи сообщений. Поэтому на скорость передачи сообщения по сети влияет только скорость передачи данных через канал связи и затраты на функционирование менеджера протокола lsm-qnet.so
, используемого модулем io-pkt-*.
Клиент остаётся заблокированным при вызове MsgSend() до тех пор пока не будет разблокирован сигналом, тайм-аутом ядра или при завершении функции.
ЗОСРВ «Нейтрино»
Максимальный размер сообщения определяется размером виртуального адресного пространства и зависит от процессорной архитектуры.
ConnectAttach(), MsgError(), MsgReceive(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgSendnc(), MsgSendPulse(), MsgSendsv(), MsgSendsvnc(), MsgSendv(), MsgSendvnc(), MsgSendvs(), MsgSendvsnc(), name_open(), ThreadCancel(), TimerTimeout()
Предыдущий раздел: Описание API системной библиотеки