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