Отправить ответное сообщение
#include <sys/neutrino.h>int MsgReplyv( int rcvid,int status,const iov_t *riov,int rparts );int MsgReplyv_r( int rcvid,int status,const iov_t *riov,int rparts );
libc
Функции MsgReplyv() и MsgReplyv_r() отправляют ответное сообщение потоку-клиенту, идентифицируемому rcvid. Поток-клиент должен находится в состоянии REPLY-блокировки. Ответное сообщение может отправить любой поток серверного процесса, но ответ может быть отправлен только единожды.
Данные функции идентичны за исключением способа возврата ошибок.
Поток-клиент rcvid будет разблокирован, а функция MsgSend*() вернёт значение status.
![]() | Функции MsgSend*_r() для индикации ошибки возвращают отрицательное значение errno, поэтому не следует задавать отрицательное значение status при вызове MsgReply*(), поскольку функции MsgSend*_r() могут интерпретировать их как код ошибки. |
Данные для ответного сообщения берутся из буферов, ка которые указывают элементы массива riov. Количество элементов этого массива задаётся аргументом rparts. Размер сообщения будет равен сумме размеров всех буферов.
Количество переданных байт имеет значение меньшее из заданных клиентом и сервером. Возвращаемые данные не могут переполнять буфер для ответного сообщения, предоставленный клиентом.
Передача данных осуществляется немедленно, отвечающий поток-сервер не блокируется. Отвечать на сообщения клиентов в порядке поступления не требуется, но в какой-то момент времени необходимо всё-таки отправить ответ(ы), чтобы клиент(ы) мог(ли) продолжить выполнение.
Широко распространен подход, когда ответное сообщение состоит из двух частей: фиксированного заголовка и буфера с данными. Функция MsgReplyv() объединяет данные из этих буферов в единую логическую последовательность данных, образующих ответное сообщение, и передает в ответный(ые) буфер(ы) потока-клиента. Нет необходимости на стороне клиента задавать такое же количество или размер ответных буферов. Переданные данные заполнят те буферы, которые предоставит клиент. Такой подход используется, например, файловой системой, чтобы при сформировать ответное сообщение из данных, расположенных в разных буферах кэша, при этом на стороне клиента они выглядят, как единая последовательность байт.
Отсутствует. В случае сетевого взаимодействия может получить управление поток с меньшим приоритетом.
-1
, код ошибки записывается в errno.
ЗОСРВ «Нейтрино»
iov_t, MsgReceive(), MsgReceivev(), MsgReply(), MsgSend(), MsgSendv(), MsgWrite(), MsgWritev()
Предыдущий раздел: Описание API системной библиотеки