Управление процессами (высокоуровневый API task.h)
API определен в заголовочном файле sysroot-*-kos/include/kos/task.h
из состава KasperskyOS SDK.
API позволяет создавать, запускать и завершать процессы, а также статически создавать IPC-каналы и передавать дескрипторы.
Сведения о функциях API приведены в таблице ниже.
Библиотека libkos
также предоставляет низкоуровневый API для управления процессами, который определен в заголовочном файле sysroot-*-kos/include/coresrv/task/task_api.h
из состава KasperskyOS SDK. Низкоуровневый API следует использовать, если только недостаточно возможностей высокоуровневого API.
Создание процессов
Чтобы создать процесс, нужно вызвать одну из следующих функций:
KosTaskInitEx()
;KosTaskInit()
;KosTaskInitFromSegEx()
;KosTaskInitFromSeg()
;KosTaskLaunch()
.
Через входной параметр params
эти функции принимают параметры создаваемого процесса в виде структуры, содержащей следующие поля:
eiid
– указатель на имя класса процесса.endpointsCount
– число предоставляемых служб.Поле может иметь нулевое значение, если процесс не предоставляет службы.
endpoints
– указатель на массив структур, содержащих характеристики предоставляемых служб (имена и идентификаторы служб, имена интерфейсов).Тип структуры определен в заголовочном файле
sysroot-*-kos/include/services/handle/if_connection.h
из состава KasperskyOS SDK.Поле может иметь значение
RTL_NULL
, если процесс не предоставляет службы.args
– указатель на массив параметров запуска программы.Последним элементом массива должно быть значение
RTL_NULL
.envs
– указатель на массив переменных окружения программы.Последним элементом массива должно быть значение
RTL_NULL
.flags
– флаги:KOS_TASK_FLAGS_NONE
– отсутствие флагов.KOS_TASK_FLAG_DUMPABLE
– процесс переходит в "замороженное" состояние в результате необработанного исключения.О "замороженном" состоянии процесса см. "Управление процессами (низкоуровневый API task_api.h)".
componentTree
– указатель на структуру, содержащую сведения из формальной спецификации компонента решения.Тип структуры определен в заголовочном файле
sysroot-*-kos/include/nk/types.h
из состава KasperskyOS SDK. Эта структура является элементом автоматически генерируемого транспортного кода.Если поле имеет значение, отличное от
RTL_NULL
, то значения в поляхeiid
,endpointsCount
иendpoints
будут проигнорированы, а имя класса процесса и параметры предоставляемых служб (включая параметры служб вложенных компонентов) будут взяты из формальной спецификации компонента решения.
Функции KosTaskInitEx()
, KosTaskInit()
, KosTaskInitFromSegEx()
и KosTaskInitFromSeg()
через выходной параметр outTask
передают указатель на адрес объекта, описывающего дочерний процесс. Этот объект представляет собой структуру, которая создается в памяти как родительского, так и дочернего процесса. Разработчику решения на базе KasperskyOS не требуется выполнять операции с полями этой структуры, но указатель на нее нужно использовать в качестве идентификатора процесса при вызове функций API. Дочерний процесс может получить адрес описывающего его объекта вызовом функции KosTaskGetSelf()
.
Если для доступа к службам, предоставляемым серверным процессом, используются статически созданные IPC-каналы, то объект, описывающий этот серверный процесс, должен быть связан со структурами, содержащими сведения о службах из формальной спецификации компонента решения. Это необходимо, чтобы при создании статического IPC-канала клиентские процессы получили сведения о службах, предоставляемых серверным процессом. Чтобы связать объект, описывающий дочерний серверный процесс, со структурами, содержащими сведения о службах из формальной спецификации компонента решения, нужно передать эти сведения через поле componentTree
параметра params
при вызове функций KosTaskInit*()
или функции KosTaskLaunch()
. Серверный процесс, который уже запущен, может связать описывающий его объект со структурами, содержащими сведения о службах из формальной спецификации компонента решения, вызовом функции KosTaskSetComponentTree()
. Это требуется, если у запущенного серверного процесса нет родительского процесса.
При вызове функции KosTaskInitEx()
, KosTaskInit()
или KosTaskLaunch()
ELF-образ из заданного исполняемого файла в ROMFS загружается в память создаваемого процесса. Если ELF-образ содержит таблицу символов .symtab
и таблицу строк .strtab
, то они загружаются в память процесса. Используя эти таблицы, ядро получает имена функций для формирования данных обратной трассировки стека (сведений о стеке вызовов).
Чтобы получить сведения об ELF-образе, загруженном в память процесса, нужно вызвать функцию KosTaskGetElfSegs()
.
При вызове функции KosTaskInit()
или KosTaskLaunch()
в качестве имени процесса и имени исполняемого файла используется одно из следующих значений:
- Значение поля
eiid
, если значение поляcomponentTree
равноRTL_NULL
. - Имя класса процессов из формальной спецификации компонента решения, если значение поля
componentTree
отлично отRTL_NULL
.
Таким же образом эти значения применяются в качестве имени процесса и/или имени исполняемого файла, если вызвать функцию KosTaskInitEx()
или KosTaskInitFromSegEx()
со значением RTL_NULL
в параметре name
и/или параметре path
. И аналогично эти значения применяются в качестве имени процесса, если вызвать функцию KosTaskInitFromSeg()
со значением RTL_NULL
в параметре name
.
Для использования функций KosTaskInitFromSegEx()
и KosTaskInitFromSeg()
необходимо, чтобы заранее были созданы буферы MDL, которые содержат сегменты ELF-образа. Сегменты ELF-образа для загрузки в память создаваемого процесса нужно задать через параметр segs
.
Через параметры entry
и relocBase
функции KosTaskInitFromSegEx()
необходимо задать точку входа в программу и смещение загрузки ELF-образа соответственно. Точка входа в программу представляет собой сумму адреса, указанного в поле e_entry
заголовка ELF-образа, и смещения загрузки ELF-образа. Генерацию случайного смещения загрузки ELF-образа и расчет адреса точки входа в программу с учетом этого смещения выполняет функция KnElfCreateVmSegEx()
, объявленная в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h
из состава KasperskyOS SDK. (Смещение загрузки ELF-образа должно быть случайным значением с целью поддержки ASLR. Об ASLR см. "Управление процессами (низкоуровневый API task_api.h)".)
С помощью функции KosTaskInitFromSegEx()
в память создаваемого процесса можно загрузить таблицу символов .symtab
и таблицу строк .strtab
, а также заголовок ELF-образа. Загрузку заголовка ELF-образа нужно выполнить, если требуется, чтобы данные из него были доступны в создаваемом процессе.
Данные, передаваемые функции KosTaskInitFromSegEx()
через параметры segs
, entry
, relocBase
и параметры, связанные с загрузкой таблицы символов .symtab
и таблицы строк .strtab
, подготавливаются функцией KnElfCreateVmSegEx()
, объявленной в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h
из состава KasperskyOS SDK.
Функция KosTaskInitFromSeg()
является упрощенной версией функции KosTaskInitFromSegEx()
и не позволяет загружать в память процесса таблицу символов .symtab
, таблицу строк .strtab
и заголовок ELF-образа, а также не позволяет задавать смещение загрузки ELF-образа (устанавливает нулевое смещение).
Функция KosTaskLaunch()
создает и сразу запускает процесс без возможности статического создания IPC-каналов.
Статическое создание IPC-каналов
Перед запуском процессов можно создать IPC-каналы между ними. Между одним клиентским и одним серверным процессом можно создать несколько IPC-каналов с разными именами. Между одним серверным и несколькими клиентскими процессами можно создать IPC-каналы с одним именем.
Чтобы создать IPC-канал с именем, соответствующим имени класса серверного процесса, нужно вызвать функцию KosTaskConnect()
.
Чтобы создать IPC-канал с заданным именем, нужно вызывать функцию KosTaskConnectToService()
.
Чтобы использовать созданный IPC-канал, на стороне клиентского процесса нужно получить клиентский IPC-дескриптор вызовом функции ServiceLocatorConnect()
, а на стороне серверного процесса нужно получить серверный IPC-дескриптор вызовом функции ServiceLocatorRegister()
. Через параметр channelName
эти функции принимают имя IPC-канала. (Функции ServiceLocatorConnect()
и ServiceLocatorRegister()
объявлены в заголовочном файле sysroot-*-kos/include/coresrv/sl/sl_api.h
из состава KasperskyOS SDK.)
Передача дескрипторов
Родительский процесс может передать один или несколько дескрипторов дочернему процессу, который еще не запущен. (Общие сведения о передаче дескрипторов приведены в разделе "Передача дескрипторов".)
Чтобы передать дескриптор дочернему процессу, нужно вызвать функцию KosTaskTransferResource()
, указав среди прочего дескриптор объекта контекста передачи ресурса, а также маску прав и условное имя потомка передаваемого дескриптора.
Чтобы найти потомка дескриптора, переданного родительским процессом, нужно вызвать функцию KosTaskLookupResource()
, указав условное имя потомка дескриптора, которое было задано родительским процессом при вызове функции KosTaskTransferResource()
.
Запуск процессов
Чтобы создать и сразу запустить процесс без статического создания IPC-каналов, нужно вызвать функцию KosTaskLaunch()
.
Чтобы запустить уже созданный процесс, перед запуском которого могут быть созданы требуемые этому процессу IPC-каналы, нужно вызвать функцию KosTaskRunEx()
или KosTaskRun()
.
Через параметр fsBackend
функции KosTaskRunEx()
нужно задать, как осуществляется поддержка файловой системы ROMFS для запускаемого процесса: ядром или системной программой fsusr
. Использование программы fsusr
обеспечивает размещение образа ROMFS в пользовательском пространстве. В пользовательском пространстве можно разместить образ ROMFS существенно большего размера, чем в пространстве ядра.
Чтобы можно было использовать файловую систему ROMFS, размещенную в пользовательском пространстве, нужно включить программу fsusr
в решение на базе KasperskyOS и создать IPC-канал с именем kl.core.FSUsr
от процесса, которому требуется использовать эту файловую систему, к процессу с именем kl.core.FSUsr
. (Клиентская часть программы fsusr
входит в библиотеку libkos
.) Чтобы проверить, поставляется ли программа fsusr
в составе KasperskyOS SDK, нужно убедиться в наличии исполняемого файла sysroot-*-kos/bin/fsusr
.
Чтобы задать, как осуществляется поддержка файловой системы в уже запущенном процессе, нужно вызывать функцию KosTaskSetSelfFSBackend()
. Эта функция может быть использована следующим образом. Родительский процесс задает, что для него файловую систему ROMFS поддерживает программа fsusr
, и вызовом функции KnFsChange()
загружает требуемый образ ROMFS. (Функция KnFsChange()
объявлена в заголовочном файле sysroot-*-kos/include/coresrv/fs/fs_api.h
из состава KasperskyOS SDK.) Затем родительский процесс выполняет запуск дочернего процесса вызовом функции KosTaskRunEx()
, указав, что для дочернего процесса файловую систему ROMFS поддерживает программа fsusr
. В результате дочерний процесс по умолчанию будет использовать образ ROMFS, размещенный в пользовательском пространстве родительским процессом.
Если родительскому процессу не требуется завершать дочерний процесс или ожидать его завершения, то после запуска дочернего процесса описывающий его объект нужно удалить, обнулив число ссылок на него с использованием функции KosTaskPut()
. Функция KosTaskLaunch()
вызывает функцию KosTaskPut()
после запуска дочернего процесса.
Завершение процессов
API позволяет завершать и ожидать завершения дочерних процессов.
Чтобы завершить дочерний процесс, нужно вызвать функцию KosTaskStop()
или KosTaskStopAndWait()
.
Чтобы ожидать, пока дочерний процесс завершится по собственной инициативе, нужно вызвать функцию KosTaskWait()
.
Чтобы объект ядра, который описывает дочерний процесс, был удален после завершения этого процесса, нужно до или после завершения дочернего процесса закрыть его дескриптор в родительском процессе. Дескриптор дочернего процесса закрывается при удалении в памяти родительского процесса объекта, описывающего дочерний процесс. Чтобы удалить объект, описывающий дочерний процесс, нужно обнулить число ссылок на этот объект, используя функцию KosTaskPut()
. Функция KosTaskLaunch()
вызывает функцию KosTaskPut()
после запуска дочернего процесса.
Подробнее о завершении процессов см. "Управление процессами (низкоуровневый API task_api.h)".
Сведения о функциях API
Функции task.h
Функция |
Сведения о функции |
---|---|
|
Назначение Создает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить сведения об ELF-образе, загруженном в память процесса. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает IPC-канал. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Создает IPC-канал с заданным именем. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Задает параметры запуска программы. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения Функция используется библиотекой |
|
Назначение Позволяет получить параметры запуска программы. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения Чтобы удалить массив параметров запуска программы, нужно вызвать функцию |
|
Назначение Удаляет массив параметров запуска программы, полученный вызовом Параметры
Возвращаемые значения Нет. |
|
Назначение Задает переменные окружения программы. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения Функция используется библиотекой |
|
Назначение Позволяет получить переменные окружения программы. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения Чтобы удалить массив переменных окружения программы, нужно вызвать функцию |
|
Назначение Удаляет массив переменных окружения программы, полученный вызовом функции Параметры
Возвращаемые значения Нет. |
|
Назначение Запускает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Запускает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Завершает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Завершает процесс и ожидает окончания завершения этого процесса. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Ожидает завершения процесса. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить дескриптор процесса. Параметры
Возвращаемые значения Дескриптор процесса. |
|
Назначение Создает и запускает процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить адрес объекта, описывающего вызывающий процесс. Параметры Нет. Возвращаемые значения Указатель на объект, описывающий процесс, или Дополнительные сведения Функция увеличивает на единицу число ссылок на объект, описывающий процесс, поэтому после вызова этой функции нужно вызвать функцию |
|
Назначение Уменьшает на единицу число ссылок на объект, описывающий процесс. Параметры
Возвращаемые значения Нет. |
|
Назначение Регистрирует службы. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения Функция используется библиотекой |
|
Назначение Задает, как осуществляется поддержка файловой системы ROMFS для вызывающего процесса: ядром или системной программой. Параметры
Возвращаемые значения Нет. |
|
Назначение Позволяет получить сведения о том, как осуществляется поддержка файловой системы ROMFS для вызывающего процесса: ядром или системной программой. Параметры Нет. Возвращаемые значения Значение, которое отражает, как осуществляется поддержка файловой системы ROMFS: ядром или системной программой. |
|
Назначение Создает структуры со сведениями о службах из формальной спецификации компонента решения и связывает эти структуры с объектом, описывающим процесс. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Передает дескриптор процессу, который еще не запущен. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Выполняет поиск дескриптора по имени, заданному функцией Параметры
Возвращаемые значения В случае успеха возвращает дескриптор, иначе возвращает |