MsgReceivev(), MsgReceivev_r()

Ожидать сообщения или импульса

Прототип:

#include <sys/neutrino.h>
int MsgReceivev( int chid,
const iov_t *riov,
int rparts,
struct _msg_info *info );
int MsgReceivev_r( int chid,
const iov_t *riov,
int rparts,
struct _msg_info *info );

Аргументы:

chid
Идентификатор канала, созданного с помощью функции ChannelCreate().
riov
Массив объектов (буферов) iov_t, в которых функция будет сохранять получаемые данные.
rparts
Количество элементов массива.
info
NULL или указатель на структуру struct _msg_info, в которой функция будет сохранять дополнительную информацию о сообщении.

Библиотека:

libc

Описание:

Функции MsgReceivev() и MsgReceivev_r() ждут поступления сообщения или импульса в канал, имеющий идентификатор chid, и сохраняют полученные данные в массиве буферев, на который указывает riov.

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

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


Note: Размер первого буфера, заданного в векторе piov, должен быть достаточным для получения импульса. В противном случае функция вернёт ошибку EFAULT.

Если сообщение уже отправлено клиентом до того, как сервер вызвал MsgReceivev(), то поток-сервер не блокируется, и сообщение немедленно записывается в приёмный буфер. Если же сообщение ещё не было отправлено, то поток-сервер переходит в состояние RECEIVE-блокирован до момента поступления сообщения.

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


Note: Эффективный приоритет потока-сервера может изменяться при получении сообщений, наследуя приоритет потока-клиента.

Если вместо NULL задан указатель info на структуру struct _msg_info, то функция сохранит дополнительную информацию о сообщении и о потоке-клиенте, его отправившем. Эта информация может также быть получена позже с помощью функции MsgInfo().

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

>0
Получено сообщение; возвращаемое значение является rcvid (идентификатором сообщения), оно идентифицирует поток-клиент и его локальный идентификатор соединения. Идентификатор rcvid может использоваться при вызове других функций Msg*() для взаимодействия с потоком-клиентом и для отправки ему ответа. Вызов функции MsgReceive() меняет состояние потока-клиента на REPLY-блокирован. При вызове потоком-сервером MsgReply*() для ответа на полученное сообщение поток-клиент будет переведен в состояние READY. Значение rcvid идентифицирует поток-клиент и используемый им идентификатор соединения.
0
Получен импульс; первый буфер вектора riov содержит структуру-импульс, имеющую тип struct _pulse. При получении импульса используемое им адресное пространство ядра немедленно освобождается. Структура struct _msg_info не обновляется.


Note: Не отвечайте на импульс.


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

STATE_RECEIVE
Ожидание сообщений.

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

В случае успешного выполнения обе функции возвращают положительное значение, если получено сообщение, или 0, осли получен импульс.

MsgReceivev()
возращает -1 и устанавливает errno.
MsgReceivev_r()
возвращает отрицательное число, имеющее значение, указанное ниже в секции "Коды ошибок". Эта функция не устанавливает errno.

Коды ошибок:

EFAULT
Ошибка при попытке доступа к предоставленным буферам.
EINTR
Функция была прервана сигналом.
EOVERFLOW
Сумма размеров буферов в массиве piov превышает значение INT_MAX.
ESRCH
Отсутствует канал с идентификатором chid.
ETIMEDOUT
Функция прервана по тайм-ауту ядра. См. TimerTimeout().

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

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

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

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

iov_t, ChannelCreate(), struct _msg_info, MsgInfo(), MsgRead(), MsgReadv(), MsgReceive(), MsgReceivePulse(), MsgReceivePulsev(), MsgReply(), MsgReplyv(), MsgWrite(), MsgWritev(), struct _pulse, TimerTimeout()




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