Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Функция CreateProcess






Основной функцией для создания процесса является CreateProcess. Данная функция создает новый процесс с единственным первичным потоком. Десять параметров функции позволяют указать основные параметры создаваемого процесса.

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

);

При вызове CreateProcess, система создает объект ядра «процесс» (структуру данных, через которую операционная система управляет процессом). Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные исполняемого файла и необходимых библиотек (DLL). Далее система формирует объект ядра «поток» для первичного потока (primary) нового процесса. Первичный поток отвечает за инициализацию процесса, обработку системных сигналов и событий. Этот поток “живет” до того момента, когда управление не будет возвращено операционной системе для завершения процесса. Первичный поток начинает с исполнения стартового кода программы (для C/C++ это функции WinMain, wWinMain, main или wmain).

Рассмотрим параметры и возвращаемое значение функции CreateProcess.

Параметры lpApplicationName и lpCommandLine используются вместе для указания исполняемой программы и аргументов командной строки. Если файл с указанным именем не найден, Windows приступает к поиску заданного файла и делает это в следующем порядке:

1. Каталог, содержащий ЕХЕ-файл вызывающего процесса.

2. Текущий каталог вызывающего процесса.

3. Системный каталог Windows.

4. Основной каталог Windows.

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

lpProcessAttributes и lpThreadAttributes указатели на структуры атрибутов защиты процесса и потока. Значениям NULL соответствует использование атрибутов защиты, заданных по умолчанию.

Флаг bInheritHandles показывает, наследует ли новый процесс открытый дескрипторы (файлов, файлов отображенных на память и т.д.) из вызывающего (родительского) процесса производящего запуск. Унаследованные дескрипторы имеют те же значения и права доступа, что и оригиналы.

Параметр dwCreationFlags задает параметры создания процесса и его приоритет. Некоторые возможные значения данного флага перечислены ниже.

CREATE_NEW_CONSOLE Новый процесс получает новую консоль вместо того, чтобы унаследовать родительскую.
CREATE_NEW_PROCESS_GROUP Создаваемый процесс - корневой процесс новой группы.
CREATE_SUSPENDED Первичная нить процесса создается в спящем (suspended) состоянии и не выполняется до вызова функции ResumeThread
REALTIME_PRIORITY_CLASS Процесс получает наивысший приоритет – Real-time (реального времени). Потоки в этом процессе обязаны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. Такие потоки вытесняют даже компоненты операционной системы.
HIGH_PRIORITY_CLASS Потоки в процессе с приоритетом High (высокий) должны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. Этот класс присвоен, например системной утилите Task Manager.
ABOVE_NORMAL_PRIORITY_CLASS Класс приоритета Above Normal (выше среднего), промежуточный между Normal и High. Данный класс впервые введен в Windows 2000.
NORMAL_PRIORITY_CLASS Потоки в процессе c приоритетом Normal (нормальный) не предъявляют особых требований к выделению им процессорного времени.
BELOW_NORMAL_PRIORITY_CLASS Процесс получит класс приоритета Below Normal (ниже среднего), промежуточный между Normal и High. Данный класс впервые введен в Windows 2000.
IDLE_PRIORITY_CLASS Потоки в процессе с приоритетом Idle выполняются, когда система не заняты другой работой. Этот класс приоритета обычно используется для утилит, работающих в фоновом режиме, экранных заставок и приложений, собирающих статистическую информацию.

 

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

lpCurrentDirectory – указатель но строку, содержащую путь к текущему каталогу нового процесса. Если значение не задано, то в качестве текущего каталога будет использоваться каталог родительского (порождающего) процесса.

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

lpProcessInformation – указатель на структуру PROCESS_INFORMATION, в которую Windows будут помещены, возвращаемые функцией значения дескрипторов и уникальные идентификаторы созданного процесса и его главного потока.

Как видно из описания функции CreateProcess, возвращаемое ей значение не является дескриптором созданного объекта типа HANDLE, как это происходит в большинстве функций. Если системе удастся создать новый процесс и его первичный поток, тогда CreateProcess вернет ненулевое значение, иначе будет возвращено нулевое значение.

 

#include " stdafx.h"

#include " windows.h"

 

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

STARTUPINFO cif;

ZeroMemory(& cif, sizeof(STARTUPINFO));

PROCESS_INFORMATION pi;

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

NULL, NULL, FALSE, NULL, NULL, NULL, & cif, & pi))

{

cout < < " Process ID: " < < pi.dwProcessId < < endl;

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

Sleep(5000); // задержка на 5 секунд

TerminateProcess(pi.hProcess, NO_ERROR); // завершение } //процесса

}


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал