Отправить процессу импульс, содержащий адрес (указатель)
#include <sys/neutrino.h>int MsgSendPulsePtr( int coid,int priority,int code,void *value );int MsgSendPulsePtr_r( int coid,int priority,int code,void *value );
-1
для использования приоритета вызывающего потока. Приоритет должен быть в корректном диапазоне, который можно определить с помощью функций sched_get_priority_min() и sched_get_priority_max().8
-битный код импульса. Несмотря на то, что code может иметь любое знаковое 8
-битное значение, не следует задавать значения code меньше нуля во избежание конфликтов со служебными импульсами ядра или имульсами, сгенерированными менеджерами ресурсов. Все эти коды начинаются со значения PULSE_CODE
и определены в заголовочном файле <sys/neutrino.h>
; для более подробной информации см. описание структуры struct _pulse в документации. Безопасные значения кода импульса лежит в диапазоне от _PULSE_CODE_MINAVAIL
до _PULSE_CODE_MAXAVAIL
.libc
Функции MsgSendPulsePtr() и MsgSendPulsePtr_r() посылают короткое неблокирующее сообщение процессу через канал, с которым установлено соединениеcoid. Эти функции рекомендуется использовать в случае, если с пульсом требуется передать указатель на данные, в другой поток процесса. Возможно передавать указатель и между процессами, но необходимо учитывать, что переданный адрес может быть недействительным в контексте принимающего процесса. Если требуется передать копию данных вместо указателя, то следует использовать MsgSend().
Отправка импульса возможна процессу, реальный или эффективный идентификатор которого соответствует одному из условий:
Проверки прав доступа идентичны тем, которые используются для kill().
MsgSendPulsePtr() может использоваться для разных целей; однако, из-за малой полезной нагрузки не следует использовать импульсы для передачи больших объемов данных путем отправки большого количества импульсов.
Импульсы помещаются в системную очередь для доставки используя динамический пул объектов памяти. Если генерировать импульсы быстрее, чем они могут быть получены сервером, через некоторое время системная очередь израсходует память и при попытке создать новый импульс функция будет возвращать ошибку EAGAIN
. Если приоритет, код и данные импульса не меняются, то ядро будет экономить память с помощью 8
-битного счетчика количества импульсов в очереди.
Эффективный приоритет потока-получателя может измениться при отправке ему импульса. Наследование приоритетов является поведением по умолчанию и может быть изменено с помощью соответствующего флага при вызове функции создания канала. |
При получении импульса с помощью функций MsgReceivev*() значение rcvid будет нуль. Это информирует получателя, что принят импульс и, в отличие от сообщение, на него нельзя ответить с помощью функций MsgReply*().
В клиент-серверных приложениях для отправки импульсов сервер обычно использует функцию MsgDeliverEvent(), а клиент функцию MsgSendPulse() или MsgSendPulsePtr(). |
Отсутствует в случае локальной передачи. В сетевом случае:
MsgSendPulsePtr() может использоваться для передачи имульсов по сети.
-1
, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.EOK
возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.
0
). ЗОСРВ «Нейтрино»
ЗОСРВ
«Нейтрино»
редакции 2021
Если при доставке импульса на сервере произошла ошибка, то либо импульс будет потерян, либо функция вернёт ошибку.
MsgDeliverEvent(), MsgReceive(), MsgReceivePulse(), MsgReceivePulsev(), MsgReceivev(), MsgReply(), MsgReplyv(), MsgSendPulse(), MsgSend(), MsgSendnc(), MsgSendsv(), MsgSendsvnc(), MsgSendv(), MsgSendvnc(), MsgSendvs(), MsgSendvsnc(), name_open(), struct _pulse, sched_get_priority_min(), sched_get_priority_max()
Предыдущий раздел: Описание API системной библиотеки