MsgReply(), MsgReply_r()

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

Прототип:

#include <sys/neutrino.h>
int MsgReply( int rcvid,
int status,
const void *msg,
int size );
int MsgReply_r( int rcvid,
int status,
const void *msg,
int size );

Аргументы:

rcvid
Идентификатор сообщения, возвращаемый потоку-серверу функцией MsgReceive*() при приеме сообщения.
status
Статус (код возврата), который вернёт функция MsgSend*() потока-клиента.
msg
Указатель на буфер, содержащий ответное сообщение.
size
Размер буфера в байтах.

Библиотека:

libc

Описание:

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

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

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


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

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

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

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

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

Сетевые взаимодействия

Функция MsgReply() имеет повышенную задержку при сетевом взаимодействии, поскольку в этом случае сообщение передается от сервера к серверному сетевому менеджеру lsm-qnet.so, который взаимодействует с клиентским lsm-qnet.so для реальной передачи данных.

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

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

Коды ошибок:

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

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

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

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

Предостережения:

Максимальный размер сообщения ограничен размером пользовательского виртуального адресного пространства и зависит от процессорной архитектуры.

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

MsgReceive(), MsgReceivev(), MsgReplyv(), MsgSend(), MsgSendv(), MsgWrite(), MsgWritev()




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