create_process

Синтаксис

PROCESS create_process(PROCESS_TYPE proc_type,
                       char *name,
                       OSENTRYPOINT *entrypoint,
                       OSADDRESS stack_size,
                       OSPRIORITY priority,
                       OSTIME timeslice,
                       PROCESS pid_block,
                       void *redir_table,
                       OSVECTOR vector,
                       OSUSER user);

Описание

Создаёт процесс как часть заданного блока.
Приоритетный, фоновый и таймерный процессы могут быть впоследствии запущены системным вызовом start, или целый блок может быть запущен, если в нём содержится только один процесс.
(пропущено про некоторые реализации OSE)

proc_type это тип процесса. допустимые значения:

  • OS_PRI_PROC: для приоритетных процессов
  • OS_BG_PROC: для фоновых процессов
  • OS_INT_PROC: для процессов прерываний
  • OS_TI_PROC: для таймерных процессов
  • OS_PHANTOM: для фантомных процессов или заглушек

name - завершающаяся нулём ASCII строка, содержащая имя процесса. (пропущено про хранение строки ядром). имя используется как таг другими процессами при поиске процесса системным вызовом hunt. имя может содержать все печатные символы.
знак дроби (/) имеет специальное значение потому что он опознаётся ядром как разделитель пути. он разделяет компоненты имени, которые обычно представляют сетевой путь. (пропущено про link handler и про имя/путь).

entrypoint - это откуда процесс должен начать выполнение. перемещаемые программы должны задавать точку входа макросом OS_PROCESS.

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

priority - приоритет процесса. допустимы значения 0-31. 0 это наивысший приоритет. приоритет рассматривается по-разному для разных типов процессов. для процессов прервываний он означает аппаратный приоритет. логический номер приоритета (0-31) проецируется на действительный аппаратный приоритет. для таймерных процессов он означает в каком порядке после прихода события таймера процесс планируется к исполнению (д.б. имеется в виду относительно других таймерных процессов). для приоритетных процессов он означает насколько важным процесс должен быть. для фоновых и фантомных процессов он не используется. (вы всё равно должны использовать допустимые значения 0-31)

timeslice - используется только для таймерных и фоновых процессов. для таймерных процессов означает количество миллисекунд перед каждой активацией процесса. для фоновых процессов означает число миллисекунд, которые процесс может выполняться до передачи управления другому фоновому процессу. заданное время округляется вверх до целого числа длительности системных тиков. timeslice с нулевым значением означает значение по умолчанию, заданное реализацией OSE. любые попытки создать приоритетный или фоновый процесс с timeslice больше, чем значение по умолчанию приведут к созданию процесса со значением timeslice по умолчанию.

pid_block - идентификатор блока, в котором создаётся новй процесс. идентификатор блока отражает среди прочего, в каком сегменте памяти выполняется процесс и какой номер пользователя по умолчанию процесс имеет. устанавливайте pid_block в 0 для создания процесса как часть блока, вызывающего функцию.

redir_table - если указана, это указатель на таблицу перенаправление, которая описывает, как сигналы, посылаемые процессу, должны быть перенаправлены. устанавливается в ноль, если не указана. если указана, эта структура содержит массив пар signal/process. когда сигнал посылается создаваемому процессу, ищется таблица перенаправлений, и если сигнал указан в таблице, он посылается нужному процессу.
таблица перенаправлений содержит массив структур типа «struct OS_redir_entry», которая определена как:

struct OS_redir_entry
{
  SIGSELECT sig;
  PROCESS pid;
}

первая запись таблицы содержит число элементов таблицы включая первый и ID процесса, которому перенаправляются неуказанные в таблице сигналы. число элементов должно быть как минимум 1, а процесс по умолчанию может быть установлен в ноль, чтоб указать на создаваемый процесс.
ядро может копировать, а может и нет эту таблицу в память ядра, так что пользователь должен учитывать, что таблица не может быть изменяться после вызова create_process.

vector - допустимо только для процессов прерываний. (пропущено)

user - ID пользователя нового процесса, или 0 для передачи по наследству ID пользователя блока, в котором создаётся процесс.

Параметры

  • name - указатель на имя процесса
  • entrypoint - адрес, откуда процесс начинает выполнение
  • stack_size - задаёт размер стека
  • priority - уровень приоритета процесса
  • timeslice - число миллисекунд
  • pid_block - имя блока, в котором создаётся процесс
  • redir_table - указатель на таблицу перенаправлений, если она есть
  • vector - номер аппаратного вектора (только для процессов прерываний)
  • user - задаёт ID пользователя процесса

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

Возвращает ID нового процесса

Ограничения

Таблица переназначений должна быть сформирована на этапе выполнения, поскольку идентификаторы процессов неизвестны на этапе компиляции. Этот системный вызов может разрешить прерывания, если он был вызван с запрещёнными прерываниями.
supervisor mode процесс (часть supervisor mode блока) может быть создан только superuser процессом (пользователь номер 0), выполняющийся в режиме супервизора.
Только superuser процесс может создавать процессы с номерами пользователя, отличающимися от номера вызывающего процесса.
Вызов create_process недоступен для процессов прерываний.
(пропущено про timeslice)

См. также

Пример

OS_PROCESS(new_process)
{
  //тело нового процесса
}
...
  PROCESS proc_;
  proc_ = create_process( OS_PRI_PROC,
     "proc",
      new_process,
      200,
      (OSPRIORITY)16,
      (OSTIME) 0,
      (PROCESS) 0,
      NULL, //см. redir_table
      (OSVECTOR) 0,
      (OSUSER) 0);
  start(proc_);
...
You: Guest
You permissions: Read
elflib/functions/create_process.txt · Последние изменения: 30/03/2015 00:00 (внешнее изменение)
Total pages: 365
RSS on Mobilefree Wiki www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Valid XHTML 1.0
© 2005-2018 supertrubka.org