MsgReceivePulse(), MsgReceivePulse_r()

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

Прототип:

#include <sys/neutrino.h>
int MsgReceivePulse( int chid,
void *pulse,
int bytes,
struct _msg_info *info );
int MsgReceivePulse_r( int chid,
void *pulse,
int bytes,
struct _msg_info *info );

Аргументы:

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

Библиотека:

libc

Описание:

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

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

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


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

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

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


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

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


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

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

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

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

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

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

Коды ошибок:

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

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

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

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

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

struct _msg_info, MsgDeliverEvent(), MsgReceive(), MsgReceivePulsev(), MsgReceivev(), MsgSendPulse(), struct _pulse, TimerTimeout()




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