Создание процессов

Создать процесс — это прежде всего означает создать описатель процесса, в каче­стве которого выступает одна или несколько информационных структур, содержащих все сведения о процессе, необходимые ОС для управления им.

Три основные события, приводящие к созданию процессов:

− Загрузка системы.

− Работающий процесс подает системный вызов на создание процесса.

− Запрос пользователя на создание процесса.

Во всех случаях, активный текущий процесс посылает системный вызов на создание нового процесса.

В ОС каждому процессу присваивается идентификатор процесса (PID - Process IDentifier)

При создании процесса автоматически запускается поток (он называется главным). При остановке главного потока автоматически останавливается и процесс. Так как процесс без потока просто бесцельно занимает ресурсы, то система автоматически уничтожает ставшим ненужным процесс. Первичный процесс создается системой при запуске, точно так же при создании первичного процесса в нем создается и поток.

Приложение тоже может создать процесс с главным потоком, используя для этой цели функцию CreateProcess(). Её прототип, находящийся в файле winbase.h, при первой встрече с ним внушает легкий ужас:

BOOL CreateProcess(LPCSTR lpApplicationName,

LPSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation);

Возвращаемое значение. В начале работы функция выделяет память для этой структуры, а потом выделяет память (виртуальную, естественно) для адресного пространства процесса. Если выделение памяти прошло без ошибок, в адресное про­странство процесса загружается код исполняемой программы и исполь­зуемых программой динамических библиотек. Только после этого созда­ется главный поток процесса. Если функции удастся произвести все эти действия без ошибок, то возвращаемое значение будет равно TRUE. FALSE явится индикатором того, что по каким-то причинам процесс не создан.

Параметры.

Первый аргумент - lpApplicationName - определяет имя исполняемого файла, для которого создается процесс. Если имя файла приводится без расширения, предполагается расширение *.exe, которое присоединяется к имени файла. Если же имя файла завершается точкой (.), тогда расширение *.exe к нему не присоединяется. Поиск файла исполняемой программы осуществляется Windows в следующем порядке.

1. В каталоге, в который загружено приложение.

2. В текущем каталоге.

3. В системном каталоге Windows.

4. В каталоге Windows, который возвращает функция GetWindowDirectory().

5. В каталогах, перечисленных в переменной окружения PATH, которая определяет порядок поиска в них.

Второй аргумент - lpCommandLine определяет передаваемую этому файлу командную строку. Если lpApplicationName равен NULL, то пер­вый (до первого пробела) элемент lpCommandLine считается именем исполняемого файла.

Третий и четвертый аргументы – lpProcessAttributes, lpThreadAttributes - определяют атрибуты защиты к про­цессу и потоку соответственно. В Windows 9х эти значения равны NULL.

Пятое поле – bInheritHandles – устанавливает разрешение/запрет наследования хэндлов вызывающего процесса, если установлено значение TRUE. При этом новый процесс наследует каждый наследуемый хэндл, открытый в вызывающем процессе. У наследуемых хэндлах имеются те же значения и привилегии, что и у исходных дискрипторов.

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

- флаги создания процесса;

- флаги установки уровня приоритета.

Седьмой аргумент - lpEnvironment – указатель на настройки окружения нового процесса. Это перечень выражений присвоения в виде переменная=значение, завершающихся нулевым символом. Обычно равен NULL. Это означает, что порождаемый процесс наследует переменные окружения родительского процесса. Если этот аргумент не равен NULL, то он должен содержать указатель на блок памяти, содер­жащий те переменные окружения, которыми будет пользоваться порож­даемый процесс.

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

Девятый аргумент – lpStartupInfo - указатель на структуру типа STARTUPINFO, которая описывает способ отображения основного окна приложения.

Десятый аргумент функции CreateProcess() - lpProcessInformation - указывающий на структуру типа PROCESS_INFORMATION, в которую записывается информация о порожденном процессе после его создания. Эта структура описана содержит хэндл созданного про­цесса, хэндл потока, уникальные идентификаторы процесса и потока.

Следует особое внимание на последние два поля. Дело в том, что Win32, если идентификатор освобожден, может повторно использовать его. К примеру, пусть процессу присвоен идентификатор 0x00001111. После завершения процесса идентификатор освобождается и какому-нибудь новому процессу может опять быть присвоен тот же идентификатор 0x00001111. Это необходимо учитывать при написании программ.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: