Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
213.38 Кб
Скачать

23. Процессы win32. Атрибуты и состояния процессов. Порождение процессов и управление ими. Основы управления процессами Win32

Процесс Win 32 – основная единица планирования ресурсов. Процесс владеет обособ­ленным (изолированным) пространством адресов памяти и пространствами описателей объектов различного рода. Адресное пространство процесса является виртуальным (см. под­система памяти) и делится на системную область, общую для всех процессов, но защищен­ную от них (в WinNT), и пользовательскую, индивидуальную для каждого процесса. Описатели представляют собой указатели (индексы) в таблицах, описывающих созданные объекты. Процесс считается владельцем объекта, но непосредственного доступа к нему не имеет, реально объект контролируется системой. Пространства описателей также изолиро­ванные: описатели в различных процессах не связаны друг с другом независимо от их числовых значений.

Процессы в Win 32 идентифицируются двояко: с помощью идентификатора (тип DWORD) и описателя (тип HANDLE). Идентификатор (PID) всегда уникален в рамках систе­мы, но описатель действует только в рамках одного процесса. Кроме того, имеется т.н. ло­кальный описатель или pseudo-handle, определенный для самого процесса и численно равный 0xFFFFFFFF.

Процесс в Win 32 всегда порождается из некоторого исполняемого файла. Клас­сический вызов Unixfork() хотя и декларирован в Win 32 API, но реально не работает.

Основной функцией создания процесса является CreateProcess(), имеющая достаточно сложный формат вызова; одновременно с процессом создается и его первичный (primary) поток.

BOOL CreateProcess(

LPCTSTR lpAppName, //имяприложения

LPTSTR lpCmdLine, //командная строка с параметрами в обычном формате

LPSECURITY_ATTRIBUTES lpProcessAttrib, //атрибутыбезопасностипроцесса

LPSECURITY_ATTRIBUTES lpThreadAttrib, //атрибутыбезопасностипотока

BOOL bInheritHandles, //флаг наследования описателей от процесса-родителя

DWORD dwCreationFlags, //флаги создания процесса

LPVOID lpEnvironment, //указатель блока параметров окружения

LPCTSTR lpCurDirectory, //имя текущего каталога для процесса

LPSTARTUPINFO lpStartupInfo, //блок начальных параметров

LPPROCESS_INFORMATION lpProcessInfo //структура данных созданного процесса

)

Функция возвращает признак успешности создания процесса.

Об атрибутах защиты и правах доступа (см. ниже) более подробно см. подсистема безопасности Windows NT. Если структура атрибутов защиты не задана (NULL), средства безопасности не задействуются. В ОС Windows 9x/Me параметры безопасности игнори­руются всегда.

Определены также функции, представляющие собой "надстройку" над базовой CreateProcess() (детализация формата вызова опущена):

WinExec() – порождение процесса из исполняемого файла с упрощенным форматом;

LoadModule() – загрузка исполняемого файла или динамической библиотеки (DLL);

ShellExecute() – порождение процесса из исполняемого файла или активизация приложения, ассоциированного с файлами этого типа и передача его (файла) на обработку;

exec..() – семейство функций стандартной библиотеки RTL.

Порожденный процесс может унаследовать объекты, созданные процессом-родите­лем, если это указано соответствующим флагом в вызове CreateProcess(). Фактически это означает, что потомок может использовать значения описателей, известных родителю, и они специфицируют те же объекты. Особенно часто это используется для обмена данными с потомком путем передачи ему открытых файлов и каналов.

Флаги создания процесса представляют собой битовую OR-маску, отдельные разряды которой указывают на дополнительные возможности и особенности поведения процесса:

CREATE_NEW_CONSOLE – старт консольного приложения в новой консоли;

CREATE_DETACHED_PROCESS – без доступа к консоли родителя;

CREATE_NEW_PROCESS_GROUP – процесс – лидер группы (для консольных);

CREATE_NO_WINDOW – консольное приложение без окна;

CREATE_SUSPENDED – процесс с неактивным первичным потоком;

DEBUG_PROCESS – открыть созданный процесс для отладки;

и т.д.

В том же параметре может быть задан класс приоритета создаваемого процесса (см. планирование и приоритеты).

Структура STARTUPINFO, передаваемая в функцию по указателю, если данный параметр не NULL, может быть использована для задания внешнего вида главного окна порождаемого приложения. Содержимое этой структуры будет использовано системой при первом вызове функций CreateWindow() и ShowWindow() в порожденном процессе, либо при создании окна консоли консольного приложения. Сам порожденный процесс может получить доступ к этой информации посредством вызова GetStartupInfo().

Как идентификатор, так и описатель процесса могут быть получены из структуры PROCESS_INFORMATION, заполняемой при создании процесса функцией CreateProcess.

typedef struct _PROCESS_INFORMATION {

HANDLE hProcess; // описательпроцесса

HANDLE hThread; // описатель первичного потока процесса

DWORD dwProcessId; // идентификатор процесса

DWORD dwThreadId; // идентификатор первичного потока

} PROCESS_INFORMATION;

Определены функции для получения процессом собственного идентификатора и описателя: GetCurrentProcessId() и GetCurrentProcess() соответственно.

Процесс, обладающий идентификатором другого процесса, может получить и его описатель (в рамках прав доступа к процессу и собственных полномочий):

HANDLE OpenProcess(

DWORD dwDesiredAccess // запрашиваемые права доступа

BOOLbInheritHandle, // флаг возможности наследования полученного описателя

DWORDdwProcessId// идентификатор "открываемого" процесса

)

Функция возвращает описатель "заказанного" процесса, действующий в рамках процесса, вызвавшего функцию.

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

Для корректного завершения процесса может быть использована функция, вызыва­емая самим процессом:

voidExitProcess(UINTuExitCode)

Единственный параметр – код возврата. Код возврата – целое число, которое остается доступным по завершении процесса, его интерпретация может быть различной. Например, часто нулевое значение рассматривается как признак нормального завершения.

ExitProcess() будет вызван автоматически при выполнении оператора return головного модуля программы main или WinMain либо при вызове функции RTLexit() (язык C/C++), аналогично ведут себя и программы, созданные в других средах.

Для "жесткого" завершения произвольного (в пределах прав и привелегий) процессо служит функция

BOOL TerminateProcess(HANDLE hProcess,DWORD dwExitCode)

При этом завершаются все потоки процесса и освобождаются его объекты, но возможны проблемы с синхронизацией, выгрузкой динамических библиотек и т.п.

Код возврата завершившегося процесса может быть получен с помощью функции:

BOOL GetExitCodeProcess(

HANDLE hProcess, // описательпроцесса

LPDWORD lpdwExitCode // указатель на переменную, которой передается значение

)

Возвращаемое функцией значение – признак успешности ее выполнения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]