Компонент ExecutionManager

21 мая 2024

ID execmgr_component

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;

}

// ...

}

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!