MsgSendPulsePtr(), MsgSendPulsePtr_r()

Отправить процессу импульс, содержащий адрес (указатель)

Прототип:

#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 );

Аргументы:

coid
Идентификатор соединения, установленного для отправки сообщений с каналом сервера с помощью функции ConnectAttach() или name_open().
priority
Приоритет импульса или -1 для использования приоритета вызывающего потока. Приоритет должен быть в корректном диапазоне, который можно определить с помощью функций sched_get_priority_min() и sched_get_priority_max().
code
8-битный код импульса. Несмотря на то, что code может иметь любое знаковое 8-битное значение, не следует задавать значения code меньше нуля во избежание конфликтов со служебными импульсами ядра или имульсами, сгенерированными менеджерами ресурсов. Все эти коды начинаются со значения PULSE_CODE и определены в заголовочном файле <sys/neutrino.h>; для более подробной информации см. описание структуры struct _pulse в документации. Безопасные значения кода импульса лежит в диапазоне от _PULSE_CODE_MINAVAIL до _PULSE_CODE_MAXAVAIL.
value
Переменная указатель, значение которой будет передано как значение импульса. Данные, на которые указывает указатель, не копируются; передаётся только само значение указателя.

Библиотека:

libc

Описание:

Функции MsgSendPulsePtr() и MsgSendPulsePtr_r() посылают короткое неблокирующее сообщение процессу через канал, с которым установлено соединениеcoid. Эти функции рекомендуется использовать в случае, если с пульсом требуется передать указатель на данные, в другой поток процесса. Возможно передавать указатель и между процессами, но необходимо учитывать, что переданный адрес может быть недействительным в контексте принимающего процесса. Если требуется передать копию данных вместо указателя, то следует использовать MsgSend().

Отправка импульса возможна процессу, реальный или эффективный идентификатор которого соответствует одному из условий:

Проверки прав доступа идентичны тем, которые используются для kill().

MsgSendPulsePtr() может использоваться для разных целей; однако, из-за малой полезной нагрузки не следует использовать импульсы для передачи больших объемов данных путем отправки большого количества импульсов.

Импульсы помещаются в системную очередь для доставки используя динамический пул объектов памяти. Если генерировать импульсы быстрее, чем они могут быть получены сервером, через некоторое время системная очередь израсходует память и при попытке создать новый импульс функция будет возвращать ошибку EAGAIN. Если приоритет, код и данные импульса не меняются, то ядро будет экономить память с помощью 8-битного счетчика количества импульсов в очереди.


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

При получении импульса с помощью функций MsgReceivev*() значение rcvid будет нуль. Это информирует получателя, что принят импульс и, в отличие от сообщение, на него нельзя ответить с помощью функций MsgReply*().


Note: В клиент-серверных приложениях для отправки импульсов сервер обычно использует функцию MsgDeliverEvent(), а клиент функцию MsgSendPulse() или MsgSendPulsePtr().

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

Отсутствует в случае локальной передачи. В сетевом случае:

STATE_NET_SEND
Вызывающий поток блокируется до тех пор пока импульс не будет доставлен локальному менеджеру Qnet, который отправит его удалённому Qnet. Удалённый Qnet выполняет MsgSendPulsePtr() от имени отправителя и передаёт обратно код возврата. В этот момент вызывающий поток будет разблокирован.

Сетевые взаимодействия

MsgSendPulsePtr() может использоваться для передачи имульсов по сети.

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

MsgSendPulsePtr()
Если возникла ошибка функция возвращает -1, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.
MsgSendPulsePtr_r()
EOK возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.

Коды ошибок:

EAGAIN
У ядра недостаточно ресурсов для постановки импульса в очередь.
EBADF
Соединение coid не существует или отключено от канала. Канал может быть уничтожен сервером или сетевым менеджером, если он не может обработать большое количество запросов.
EFAULT
Узел получателя не доступен (например, произошла ошибка при пересылке сообщения через Qnet).
EHOSTDOWN
Узел получателя не доступен (например, произошла ошибка при пересылке сообщения через Qnet).
EHOSTUNREACH
Взаимодействие с удалённым узлом невозможно (например, через Qnet).
EINVAL
Заданный приоритет некорректен (например, 0).
EPERM
Этот процесс не имеет прав отправить импульс через соединение coid.
ESRVRFAULT
Ошибка в адресном пространстве сервера при попытке ядра записать импульс в предоставленный сервером буфер.

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

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

Поддерживается, начиная с ЗОСРВ «Нейтрино» редакции 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 системной библиотеки