MsgRead(), MsgRead_r()

Считать данные из сообщения

Прототип:

#include <sys/neutrino.h>
int MsgRead( int rcvid,
void *msg,
int bytes,
int offset );
int MsgRead_r( int rcvid,
void *msg,
int bytes,
int offset );

Аргументы:

rcvid
Идентификатор сообщения, возвращаемый потоку-серверу функцией MsgReceivev*() при приеме сообщения.
msg
Указатель на буфер, в котором функция будет сохранять данные.
bytes
Количество байт, которые необходимо прочитать. При этом функция возвращает количество байт, которые реально считаны.
offset
Смещение относительно начала отправленного сообщения. Указывает, откуда надо начинать чтение данных.

Библиотека:

libc

Описание:

Функции MsgRead() и MsgRead_r() вычитывают данные из сообщения, отправленного потоком, идентифицированным rcvid. Выполнение чтения возможно до отправки клиенту ответа. Клиент будет находиться в REPLY-блокированном состоянии. Выполнять чтение сообщения может любой поток процесс-получателя.

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

Передача данных выполняется немедленно, поток-читатель не блокируется. Состояние потока-отправителя не меняется.

Данные функции используются в следующих ситуациях:

После использования MsgRead() необходимо вызвать MsgReply*(), чтобы разблокировать REPLY-блокированного клиента и завершить обмен сообщениями.

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

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

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

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

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

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

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

Коды ошибок:

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

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

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

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

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

MsgReadv(), MsgReceive(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgWrite(), MsgWritev()




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