API определен в заголовочных файлах, расположенных в директории sysroot-*-kos/include/component/execution_manager/
из состава SDK.
Сценарий использования компонента ExecutionManager описан в статье "Запуск процесса с помощью KasperskyOS API".
Интерфейс execution_manager_proxy.h
API определен в заголовочном файле sysroot-*-kos/include/component/execution_manager/kos_ipc/execution_manager_proxy.h
Интерфейс содержит фабричный метод CreateExecutionManager()
для получения указателя на экземпляр интерфейса IExecutionManager
, необходимого для работы с компонентом ExecutionManager.
Пример использования:
client.cpp
#include <component/execution_manager/kos_ipc/execution_manager_proxy.h>
...
namespace execmgr = execution_manager;
int main(int argc, const char *argv[])
{
// ...
execmgr::IExecutionManagerPtr ptr;
// имя IPC-канала для соединения с процессом ExecutionManager. Должно совпадать со значением MAIN_CONN_NAME в файле CMakeLists.txt для сборки ExecutionManager.
char mainConnection[] = "ExecMgrEntity";
execmgr::ipc::ExecutionManagerConfig cfg{mainConnection};
if (CreateExecutionManager(cfg, ptr) != eka::sOk)
{
std::cerr << "Cannot create execution manager" << std::endl;
return EXIT_FAILURE;
}
// ...
}
Интерфейс IExecutionManager
API определен в заголовочном файле sysroot-*-kos/include/component/execution_manager/i_execution_manager.h
Интерфейс IExecutionManager
позволяет получить доступ к указателям на следующие интерфейсы:
IApplicationController
- интерфейс для запуска\остановки процессов;ISystemController
- интерфейс для управления системой.Пример использования:
client.cpp
int main(int argc, const char *argv[])
{
// ...
execmgr::IApplicationControllerPtr ac;
if (ptr->GetApplicationController(ac) != eka::sOk)
{
std::cerr << "Cannot get application controller" << std::endl;
return EXIT_FAILURE;
}
execmgr::ISystemControllerPtr sc;
if (ptr->GetSystemController(sc) != eka::sOk)
{
std::cerr << "Cannot get system controller" << std::endl;
return EXIT_FAILURE;
}
// ...
}
Интерфейс IApplicationController
API определен в заголовочном файле sysroot-*-kos/include/component/execution_manager/i_application_control.h
Интерфейс IApplicationController
предоставляет следующие методы, позволяющие изменять состояние процесса:
StartEntity(
const std::filesystem::path& runPath,
const StartEntityInfo& info,
StartEntityResultInfo& resInfo
) - метод для запуска процесса.
RestartEntity(EntityId endId)
- метод для перезапуска ранее запущенного процесса.ShutdownEntity(EntityId entId)
- метод для отправки процессу сигнала на завершение.StopEntity(EntityId entId)
- метод для немедленной остановки исполнения процесса.Метод StartEntity()
принимает путь к исполняемому файлу, который нужно запустить, а также структуру с параметрами запуска процесса StartEntityInfo
; а возвращает структуру с результатами запуска процесса StartEntityResultInfo
. Все поля структуры StartEntityInfo
являются опциональными для инициализации.
Остальные методы принимают структуру EntityId
, идентифицирующую запущенный процесс.
struct IApplicationController
{
// Все поля структуры StartEntityInfo являются опциональными для инициализации.
struct StartEntityInfo
{
// Имя процесса. Если не указано, то будет использовано имя класса процесса.
// Если не указано имя класса процесса, то будет использовано имя исполняемого файла.
std::string entityName;
// Класс процесса. Если не указан, то будет использовано имя процесса. Если не указано имя процесса, то будет использовано имя исполняемого файла.
std::string eiid;
std::vector<std::string> args; // Аргументы командной строки.
std::vector<std::string> envs; // Переменные окружения.
// Политика перезапуска процесса при его аварийном завершении. Возможные значения:
// EntityRestartPolicy::DoNotRestart - не перезапускать.
// EntityRestartPolicy::AlwaysRestart - всегда перезапускать.
EntityRestartPolicy restartPolicy { EntityRestartPolicy::DoNotRestart };
};
struct StartEntityResultInfo
{
std::string eiid; // Класс безопасности, присвоенный процессу.
EntityId entId; // Структура, идентифицирующая запущенный процесс.
Uid sid; // Идентификатор безопасности запущенного процесса.
std::string taskName; // Имя запущенного процесса.
};
};
Пример использования:
client.cpp
int main(int argc, const char *argv[])
{
// ...
const fs::path appPath{"/application"};
execmgr::IApplicationController::StartEntityResultInfo result;
execmgr::IApplicationController::StartEntityInfo info;
info.entityName = std::string{"application.Application"};
info.eiid = std::string{"application.Application"};
info.args = std::vector<std::string>{"1", "ARG1", "ARG2" , "ARG3"};
info.envs = std::vector<std::string>{"ENV1=10", "ENV2=envStr"};
std::cout << "Starting application from elf\n";
if (ac->StartEntity(appPath, info, result) != eka::sOk)
{
std::cerr << "Can not start application from " << appPath << std::endl;
return EXIT_FAILURE;
}
std::cout << "Application started with process sid " << result.sid << "\n";
auto AppId = result.entId;
if (ac->StopEntity(AppId) != eka::sOk)
{
std::cerr << "Cannot stop process " << appPath << std::endl;
return EXIT_FAILURE;
}
// ...
}
Интерфейс ISystemController
API определен в заголовочном файле sysroot-*-kos/include/component/execution_manager/i_system_control.h
Интерфейс ISystemController
предоставляет следующий метод для управления системой:
StopAllEntities()
- метод останавливает все запущенные процессы; затем завершает процесс ExecutionManager; а затем отправляет в ядро запрос на выключение устройства.Пример использования:
client.cpp
int main(int argc, const char *argv[])
{
// ...
if (sc->StopAllEntities() != eka::sOk)
{
std::cerr << "Cannot stop all processes\n";
return EXIT_FAILURE;
}
// ...
}
В начало