Получить импульс
#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 );
NULL
.libc
Функции MsgReceivePulse() и MsgReceivePulse_r() ждут поступления импульса в канал, имеющий идентификатор chid, и сохраняют полученные данные в буфере, на который указывает pulse.
Данные функции идентичны за исключением способа возврата ошибок.
Количество переданных байт будет меньшим из значений размера, указанного клиентом и сервером. Полученные данные не могут переполнять предоставленный приемный буфер.
![]() | Размер буфера pulse должен быть достаточным для получения импульса. В противном случае функция вернёт ошибку EFAULT . |
Если импульс уже отправлен клиентом до того, как сервер вызвал MsgReceivePulse(), то поток-сервер не блокируется, и импульс немедленно записывается в приёмный буфер. Если же импульс ещё не был отправлен, то поток-сервер переходит в состояние RECEIVE-блокирован до момента поступления импульса.
Если в канал было отправлено несколько импульсов и не было потока, их ожидающего, то импульсы будут помещены в очередь в порядке их приоритетов.
![]() | Эффективный приоритет потока-сервера при получении импульса может изменяться, наследуя приоритет импульса. |
При успешном выполнении функции MsgReceivePulse() и MsgReceivePulse_r() возвращают 0
, что означает, что они приняли импульс. При получении импульса:
![]() | Не отвечайте на импульс. |
В случае успешного выполнения обе функции возвращают 0
. Если возникла ошибка, то:
-1
и устанавливает errno.
EFAULT
, а функция MsgReceivePulse() останется заблокированной. ЗОСРВ «Нейтрино»
struct _msg_info, MsgDeliverEvent(), MsgReceive(), MsgReceivePulsev(), MsgReceivev(), MsgSendPulse(), struct _pulse, TimerTimeout()
Предыдущий раздел: Описание API системной библиотеки