MsgReceivePulsev(), MsgReceivePulsev_r()

Получить импульс

Прототип:

#include <sys/neutrino.h>
int MsgReceivePulsev( int chid,
const iov_t *piov,
int parts,
struct _msg_info *info );
int MsgReceivePulsev_r( int chid,
const iov_t *piov,
int parts,
struct _msg_info *info );

Аргументы:

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

Библиотека:

libc

Описание:

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

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

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


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

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

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


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

При успешном выполнении функции MsgReceivePulsev() и MsgReceivePulsev_r() возвращают 0, что означает, что они приняли импульс. При получении импульса:


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

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

STATE_RECEIVE
Ожидание импульсов.

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

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

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

Коды ошибок:

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

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

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

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

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

struct _msg_info, iov_t, MsgDeliverEvent(), MsgReceive(), MsgReceivePulse(), MsgReceivev(), MsgSendPulse(), _pulse, TimerTimeout()




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