Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







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





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

из следующих компонентов:

структура данных, содержащая всю информацию о процессе, в том числе список открытых дескрипторов различных системных ресурсов, уникальный идентификатор процесса, различную статистическую информацию и т.д.;

адресное пространство – диапазон адресов виртуальной памяти, которым может пользоваться процесс;

исполняемая программа и данные, проецируемые на виртуальное адресное пространство процесса. Поток (thread) –сущность внутри процесса, получающая процессорное время для выполнения. В каждом процессе есть минимум один поток. Этот первичный поток создается системой автоматически при создании процесса. Далее этот поток может породить другие потоки, те в свою очередь новые и т.д. Таким образом, один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном пространстве процесса. Каждый поток имеет:

уникальный идентификатор потока;

содержимое набора регистров процессора, отражающих состояние процессора;

два стека, один из которых используется потоком при выполнении в режиме ядра, а другой – в пользовательском режиме;

закрытую область памяти, называемую локальной памятью потока (thread local storage, TLS) и используемую подсистемами, run-time библиотеками и DLL.

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

В Windows реализована система вытесняющего планирования на основе приоритетов, в которой всегда выполняется поток с наибольшим приоритетом, готовый к выполнению.

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

Однако поток может не полностью использовать свой квант. Как только другой поток с более высоким приоритетом готов к выполнению, текущий поток вытесняется, даже если его квант еще не стек

Для создания процессов используется функция CreateProcess – это основная функция запуска процесса, все остальные функции такие как WinExec и

LoadModule оставлены для совместимости и используют CreateProcess.

Функция CreateProcess

BOOL CreateProcess

(

LPCTSTR lpApplicationName, // имя исполняемого модуля LPTSTR lpCommandLine, // Командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes, // Указатель на структуру // SECURITY_ATTRIBUTES

LPSECURITY_ATTRIBUTES lpThreadAttributes, // Указатель на структуру // SECURITY_ATTRIBUTES

BOOL bInheritHandles, // Флаг наследования текущего процесса

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

LPVOID lpEnvironment, // Указатель на блок среды

LPCTSTR lpCurrentDirectory, // Текущий диск или каталог

LPSTARTUPINFO lpStartupInfo, // Указатель нас структуру STARTUPINFO

LPPROCESS_INFORMATION lpProcessInformation // Указатель нас структуру // PROCESS_INFORMATION

);

Параметры:

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

lpCommandLine – командная строка. Здесь передаются параметры. Она может бать NULL. Здесь можно указать и путь и имя модуля.

lpProcessAttributes – здесь определяются атрибуты защиты для нового приложения. Если указать NULL то система сделает это по умолчанию.

lpThreadAttributes – здесь определяются атрибуты защиты для первого потока созданного приложением. NULL опять приводит к установке по умолчанию.

bInheritHandles – флаг наследования от процесса производящего запуск. Здесь наследуются дескрипторы. Унаследованные дескрипторы имеют те же значения и права доступа, что и оригиналы.

dwCreationFlags. Флаг способа создание процесса и его приоритет:

CREATE_DEFAULT_ERROR_MODE – Новый процесс не наследует режим ошибок (error mode) вызывающего процесса.

CREATE_NEW_CONSOLE – Новый процесс получает новую консоль вместо того, чтобы унаследовать родительскую.

CREATE_NEW_PROCESS_GROUP – Создаваемый процесс - корневой процесс новой группы.

CREATE_SEPARATE_WOW_VDM – Только Windows NT: Если этот флаг установлен, новый процесс запускается в собственной Virtual DOS Machine (VDM).

CREATE_SHARED_WOW_VDM – Только Windows NT: Этот флаг указывает функции CreateProcess запустит новый процесс в разделяемой Virtual DOS Machine.

CREATE_SUSPENDED – Первичная нить процесса создается в спящем (suspended) состоянии и не выполняется до вызова функции ResumeThread.

CREATE_UNICODE_ENVIRONMENT – Если этот флаг установлен, блок переменных окружения, указанный в параметре lpEnvironment, использует кодировку Unicode. Иначе – кодировку ANSI.

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

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

DETACHED_PROCESS – Создаваемый процесс не имеет доступа к родитель ской консоли. Этот флаг нельзя использовать с флагом CREATE_NEW_CONSOLE.

HIGH_PRIORITY_CLASS – Указывает на то, что процесс выполняет критичные по времени задачи.

IDLE_PRIORITY_CLASS – Указывает процесс, выполняются только когда система находится в состоянии ожидания.

NORMAL_PRIORITY_CLASS – Указывает на процесс, без каких либо специальных требований к выполнению.

REALTIME_PRIORITY_CLASS – Указывает процесс имеющий наивысший возможный приоритет.

lpEnvironment – указывает на блок среды. Если NULL, то будет использован блок среды родительского процесса. Блок среды это список переменных имя = значение в виде строк с нулевым окончанием.

lpCurrentDirectory – Указывает текущий диск и каталог. Если NULL, то будет использован диск и каталог процесса родителя.

lpStartupInfo – Указатель на структуру STARTUPINFO, которая определяет параметры главного окна порожденного процесса;

lpProcessInformation – Указатель на структуру PROCESSINFO, которая будет заполнена информацией о порожденном процессе после возврата из функции. В результате выполнение функций вернет FALSE или TRUE. В случае успеха TRUE. Пример использования функции представлен в листинге 15.

STARTUPINFO cif;

ZeroMemory(&cif,sizeof(STARTUPINFO));

PROCESS_INFORMATION pi;

if (CreateProcess("c:\\windows\\notepad.exe",NULL,

NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE)

{

cout << "process" << endl;

cout << "handle " << pi.hProcess << endl;

Sleep(1000); // подождать

TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс

}

Листинг 15 – Пример использования функции CreateProcess

Для удаления процесса используется функция:

Функция TerminateProcess

BOOL TerminateProcess

(

HANDLE hProcess, // Указатель процесса

UINT uExitCode // Код возврата процесса

);

Параметры:

hProcess – Дескриптор процесса, который завершает работу.

uExitCode – Код выхода, который использует процесс и потоки, чтобы завершить работу в результате этого вызова.

Используйте функцию GetExitCodeProcess, чтобы извлечь значение выхода процесса. Используйте функцію GetExitCodeThread, чтобы извлечь значение выхода потока.

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

Если функция завершается успешно, величина возвращаемого значения – не ноль. Если функция завершается с ошибкой, величина возвращаемого значения – ноль. Чтобы получать расширенные данные об ошибках, вызовите GetLastError.

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

Функция FindWindowEx

HWND FindWindowEx

(

HWND hwndParent, // дескриптор родительского окна

HWND hwndChildAfter, // дескриптор дочернего окна

LPCTSTR lpszClass, // указатель на имя класса

LPCTSTR lpszWindow // указатель на имя окна

);

Функция FindWindowEx извлекает дескриптор окна, чье имя класса и имя окна совпадают с указанными строками. Функция также просматривает дочерние окна, начиная с того, дескриптор которого передан функции в качестве параметра

hwndChildAfter.

Параметры:

hwndParent – идентифицирует родительское окно, среди дочерних окон котрого будет проводиться поиск. Если значение параметра hwndParent равно NULL, функция использует рабочий стол Windows в качестве родительского окна. Функция проводит поиск среди окон, являющимися дочерними окнами рабочего стола.

hwndChildAfter – идентифицирует дочернее окно. Поиск начинается со следующего окна в Z-последовательности. Окно, указанное параметром hwndChildAfter, должно быть прямым дочерним окном указанного параметром hwndParent окна, а не порожденным окном.

Если значение параметра hwndChildAfter равно NULL, поиск начинается с первого дочернего окна.

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

lpszWindow – указывает на завершающуюся нулем строку, определяющую имя окна (заголовок окна). Если значение этого параметра равно NULL, то совпадающими со строкой считаются все имена окон.

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

В случае успеха возвращается дескриптор окна, которое имеет заданные имя класса и имя окна. В случае неудачи возвращается NULL. Для получения дополнительной информации об ошибке вызовите функцию GetLastError.

Данная функция позволяет искать окно по названию класса окна или по названию титула окна. После получения HWND искомого приложения, не обходимо получить номер (ID) процесса, например с помощью функции:







Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...

ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.