resmgr_msgreplyv()

Ответить клиенту сообщением

Прототип:

#include <sys/resmgr.h>
int resmgr_msgreplyv( resmgr_context_t *ctp,
struct iovec *iov,
int parts );

Аргументы:

ctp
Указатель на структуру resmgr_context_t, которую библиотека менеджера ресурсов использует для передачи контекстной информации между функциями. Данная функция извлекает rcvid из этой структуры.
iov
Массив объектов iov_t, содержащих сообщение, из которых будет сформирован ответ.
parts
Количество элементов массива.

Библиотека:

libc

Описание:

Цель использования resmgr_msgreplyv() вместо использования MsgReplyv() состоит в том, что resmgr_msgreplyv() поддерживает обратный порядок байт стандартных типов сообщений resmgr, тогда как MsgReplyv() - нет. Функция resmgr_msgreplyv() является оберткой над MsgReplyv() и предоставляет тот же функционал. Вызов resmgr_msgreplyv() отвечает сообщением потоку, идентифицированному ctp->rcvid. Эта функция вызывается сервером для ответа клиенту. Клиентский поток уже должен находиться в состоянии REPLY. Ответный поток должен быть заблокирован в состоянии REPLY. Любой поток в процессе получения может ответить на сообщение; однако на него можно ответить только один раз для каждого приема.


Note: Можно заполнить буфер ответа клиента по мере того, как данные становятся доступными, используя resmgr_msgwrite() и resmgr_msgwritev(); однако тогда необходимо будет использовать resmgr_msgpeply() или resmgr_msgpeplyv(), чтобы разблокировать клиента.

Функции, имена которых содержат суффикс «v», поддерживают составные сообщения.


Данные берутся из массива буферов сообщений, на которые указывает iov. Количество элементов в этом массиве задается параметром parts. Размер сообщения - это сумма размеров каждого буфера.

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

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

Довольно часто в ответ отправляются сообщения, состоящие из двух частей, состоящих из фиксированного заголовка и буфера данных. Функция resmgr_msgreplyv() собирает данные из списка буферов в единое непрерывное сообщение и передает его в буфер(-ы) ответа отправителя. Отправителю не нужно указывать такое же количество или размер буферов. Данные закладываются, заполняя каждый буфер по мере необходимости. Файловая система, например, создает список ответов, указывающий на ее кэш, чтобы ответить тем, что является одним непрерывным фрагментом данных.

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

Отсутствуют. В сети могут выполняться потоки с более низким приоритетом.

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

Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

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

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

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

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

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

iov_t, resmgr_msgwrite(), resmgr_msgwritev(), resmgr_context_t, resmgr_msgread(), resmgr_msgreadv(), resmgr_msgwritev(), MsgWrite(), MsgReplyv(), MsgReceive(), MsgReceivev(), MsgReply(), MsgSend(), MsgSendv()




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