Считать данные из сообщения
#include <sys/neutrino.h>
int MsgReadv( int rcvid,
const iov_t *riov,
int rparts,
int offset );
int MsgReadv_r( int rcvid,
const iov_t *riov,
int rparts,
int offset );
- rcvid
- Идентификатор сообщения, возвращаемый потоку-серверу функцией MsgReceivev*() при приеме сообщения.
- riov
- Массив объектов iov_t, в которых функции могут сохранять данные.
- rparts
- Количество элементов массива riov.
- offset
- Смещение относительно начала отправленного сообщения. Указывает, откуда надо начинать чтение данных.
libc
Функции MsgReadv() и MsgReadv_r() вычитывают данные из сообщения, отправленного потоком, идентифицированным rcvid. Выполнение чтения возможно до отправки клиенту ответа. Клиент будет находиться в REPLY-блокированном состоянии. Выполнять чтение сообщения может любой поток процесс-получателя.
Данные функции идентичны за исключением способа возврата ошибок.
Передача данных выполняется немедленно, поток-читатель не блокируется. Состояние потока-отправителя не меняется.
При попытке чтения данных больше, чем размер доступного буфера клиента, функция вернет количество реально прочитанных байт.
Данные функции используются в следующих ситуациях:
- Отправленное сообщение включает фиксированный заголовок и переменное количество данных. В заголовке содержится значение размера данных. Если данные большие и должны быть размещены в одном или нескольких буферах (например, в кэше файловой системы), то вместо того, чтобы получать их в один большой буфер, а затем копировать в другие буферы, удобнее с помощью MsgReceive() получить только заголовок, а затем вызвать MsgReadv(), чтобы сразу считать данные в требуемые буферы.
- Сообщение получено, но пока не может быть обработано. Позже должно произойти событие, позволяющее обработать данные. Вместо того, чтобы хранить сообщение до обработки, используя ОЗУ, можно перечитать его с помощью MsgReadv() пока отправитель остаётся заблокированным.
- Сообщения имеют размер больше, чем доступные буферы. Например, такое может быть в ситуации, когда процесс является агентом между двумя процессами и просто выполняет фильтрацию данных. Сообщение можно читать небольшими фрагментами с помощью MsgReadv() и записывать небольшими фрагментами с помощью MsgWrite*().
После использования MsgReadv() необходимо вызвать MsgReply*(), чтобы разблокировать REPLY-блокированного клиента и завершить обмен сообщениями.
Отсутствует. В случае сетевого взаимодействия может получить управление поток с меньшим приоритетом.
- MsgReadv()
- Если возникла ошибка функция возвращает
-1
, код ошибки записывается в errno.
- MsgReadv_r()
- Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.
- EFAULT
- Ошибка в адресном пространстве сервера при попытке доступа к буферам отправленного сообщения.
- ESRCH
- Поток, ассоциированный с rcvid не существует или отключил соединение от канала.
- ESRVRFAULT
- Ошибка при попытке ядра получить доступ к предоставленным буферам.
ЗОСРВ «Нейтрино»
- Нет
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Да
- В потоке
- Да
iov_t, MsgRead(), MsgReceive(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgWrite(), MsgWritev()
Предыдущий раздел: Описание API системной библиотеки