Содержание
Основы IPC в KasperskyOS
В KasperskyOS единственным способом межпроцессного взаимодействия (IPC) является обмен сообщениями.
Виды сообщений и роли сущностей
Обмен сообщениями в KasperskyOS построен по клиент-серверной модели.
Во взаимодействии двух сущностей одна из них является клиентом (клиентская сущность), а вторая — сервером (серверная сущность). Клиент инициирует взаимодействие, отправляя сообщение-запрос (далее также "запрос"). Сервер получает запрос и отвечает на него, отправляя клиенту сообщение-ответ (далее также "ответ").
IPC-каналы
Чтобы две сущности могли обмениваться сообщениями, между ними должен быть установлен IPC-канал (далее также "канал" или "соединение"). Каждая сущность может иметь несколько соединений, выступая как клиент для одних сущностей и как сервер — для других.
Системные вызовы
KasperskyOS предоставляет три системных вызова для обмена IPC-сообщениями: Call
, Recv
и Reply
. Соответствующие функции объявлены в файле syscalls.h
:
Call()
– используется клиентом для отправки запроса и получения ответа. Принимает IPC-дескриптор, буфер с запросом и буфер под ответ.Recv()
– используется сервером для получения запроса. Принимает IPC-дескриптор и буфер под запрос.Reply()
– используется сервером для отправки ответа. Принимает IPC-дескриптор и буфер с ответом.
Функции Call()
, Recv()
и Reply()
возвращают rcOk
или код ошибки.
Вызовы Call()
и Recv()
являются блокирующими, то есть обмен сообщениями происходит по принципу рандеву:
- Серверный поток, выполнивший вызов
Recv()
, остается заблокированным до момента получения запроса. - Клиентский поток, выполнивший вызов
Call()
, остается заблокированным до момента получения ответа от сервера.
Системные вызовы редко используются в коде сущности. Вместо них рекомендуется использовать более удобные NK-сгенерированные методы, которые, в свою очередь, выполняют системные вызовы.