MsgReplyv(), MsgReplyv_r()

Отправить ответное сообщение

Прототип:

#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 );

Аргументы:

rcvid
Идентификатор сообщения, возвращаемый потоку-серверу функцией MsgReceivev*() при приеме сообщения.
status
Статус (код возврата), который вернёт функция MsgSend*() потока-клиента.
riov
Указатель на массив объектов (буферов) iov_t, которые содержат ответное сообщение.
rparts
Количество элементов массива.

Библиотека:

libc

Описание:

Функции MsgReplyv() и MsgReplyv_r() отправляют ответное сообщение потоку-клиенту, идентифицируемому rcvid. Поток-клиент должен находится в состоянии REPLY-блокировки. Ответное сообщение может отправить любой поток серверного процесса, но ответ может быть отправлен только единожды.

Данные функции идентичны за исключением способа возврата ошибок.

Поток-клиент rcvid будет разблокирован, а функция MsgSend*() вернёт значение status.


Note: Функции MsgSend*_r() для индикации ошибки возвращают отрицательное значение errno, поэтому не следует задавать отрицательное значение status при вызове MsgReply*(), поскольку функции MsgSend*_r() могут интерпретировать их как код ошибки.

Данные для ответного сообщения берутся из буферов, ка которые указывают элементы массива riov. Количество элементов этого массива задаётся аргументом rparts. Размер сообщения будет равен сумме размеров всех буферов.

Количество переданных байт имеет значение меньшее из заданных клиентом и сервером. Возвращаемые данные не могут переполнять буфер для ответного сообщения, предоставленный клиентом.

Передача данных осуществляется немедленно, отвечающий поток-сервер не блокируется. Отвечать на сообщения клиентов в порядке поступления не требуется, но в какой-то момент времени необходимо всё-таки отправить ответ(ы), чтобы клиент(ы) мог(ли) продолжить выполнение.

Широко распространен подход, когда ответное сообщение состоит из двух частей: фиксированного заголовка и буфера с данными. Функция MsgReplyv() объединяет данные из этих буферов в единую логическую последовательность данных, образующих ответное сообщение, и передает в ответный(ые) буфер(ы) потока-клиента. Нет необходимости на стороне клиента задавать такое же количество или размер ответных буферов. Переданные данные заполнят те буферы, которые предоставит клиент. Такой подход используется, например, файловой системой, чтобы при сформировать ответное сообщение из данных, расположенных в разных буферах кэша, при этом на стороне клиента они выглядят, как единая последовательность байт.

Состояния блокировки:

Отсутствует. В случае сетевого взаимодействия может получить управление поток с меньшим приоритетом.

Возвращаемое значение:

MsgReplyv()
Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.
MsgReplyv_r()
Функция не устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.

Коды ошибок:

EFAULT
Ошибка в адресном пространстве клиента при попытке доступа к буферу, выделенному для ответного сообщения.
ESRCH
Поток, ассоциированный с rcvid, не существует, или отключил соединение от канала, или больше не находится в состоянии REPLY-блокировки.
ESRVRFAULT
Ошибка при попытке ядра получить доступ к предоставленным буферам.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

iov_t, MsgReceive(), MsgReceivev(), MsgReply(), MsgSend(), MsgSendv(), MsgWrite(), MsgWritev()




Предыдущий раздел: Описание API системной библиотеки