resmgr_msgreply()

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

Прототип:

#include <sys/resmgr.h>
int resmgr_msgreply( resmgr_context_t *ctp,
void *ptr,
int len );

Аргументы:

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

Библиотека:

libc

Описание:

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


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

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


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

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

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

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

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

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

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

Коды ошибок:

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

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

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

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

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

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




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