Отправить сообщение (без точки завершения потока)
#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-блокированным.
| Эффективный приоритет потока-получателя может измениться (в значение приоритета потока-отправителя) при отправке ему сообщения. Наследование приоритетов является поведением по умолчанию и может быть изменено с помощью соответствующего флага при вызове функции создания канала. |
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 системной библиотеки