MsgWrite(), MsgWrite_r()

Отправить ответ

Прототип:

#include <sys/neutrino.h>
int MsgWrite( int rcvid,
const void *msg,
int size,
int offset );
int MsgWrite_r( int rcvid,
const void *msg,
int size,
int offset );

Аргументы:

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

Библиотека:

libc

Описание:

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

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

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

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

Использование одиночного вызова MsgReply*() эффективнее, чем использование вызовов MsgWrite() с последующим вызовом MsgReply*().

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

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

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

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

Передача данных от сервера к серверному сетевому менеджеру lsm-qnet.so осуществляется эффективным образм, но, поскольку серверный lsm-qnet.so не имеет способа определить размер приемного буфера клиента, MsgWrite() может возвращать неточное значение количества байт, отправленных сервером - возвращаемое значение может указывать количество байт, записанных сервером в свой lsm-qnet.so.

Для сокращения сетевых транзакций сообщение буферезуется в серверном lsm-qnet.so до вызова MsgReply*().

Для того, чтобы определить размер ответного буфера клиента, необходимо установить флаг _NTO_CHF_REPLY_LEN при вызове ChannelCreate().

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

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

Коды ошибок:

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

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

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

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

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

ChannelCreate(), MsgRead(), MsgReadv(), MsgReceive(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgWritev()




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