пользователей: 21211
предметов: 10450
вопросов: 177346
Конспект-online
зарегистрируйся или войди через vk.com чтобы оставить конспект.
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Процесс. Определение, особенности. Создание процесса. Пример

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

  • объекта ядра, через который операционная система управляет процессом Там же хранится статистическая информация о процессе,
  • адресного пространства, в котором содержится код и данные всех EXE- и DLL модулей Именно в нем находятся области памяти, динамически распределяемой для стеков потоков и других нужд.

Процессу в Win32 отводится 4 Гб адресного пространства.

Процесс в Win32 является инертным, т.е. он ничего не выполняет, а только владеет адресным пространством, куда загружаются код и данные EXE файла и DLL библиотек.

Так как процессы инертны, чтобы выполнить код программы необходимо создать поток. У процесса потоков может быть несколько. Все они будут выполнять код программы "одновременно".

Чтобы все потоки работали, ОС выделяет каждому из них определенные отрезки времени, которые называются квантами. Время выделяется по принципу «карусели».

Функция создания процесса

BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);

Функция создает объект ядра – процесс, создает виртуальное адресное пространство 4 Гб, загружает в него код и данные EXE файла.

Далее ОС создает объект ядра – первичный поток процесса. Первичный поток начинает работу со стартового кода. 

При удачном создании процесса функция вернет TRUE, иначе False. Код ошибки можно узнать, вызвав функцию DWORD GetLastError().

Если pszApplicationName - не пустая строка, система считает, что в ней задано имя выполняемой программы, причем находящейся в текущем каталоге;

pszCommandLine – командная строка, содержащая имя выполняемого файла и параметры командной строки.

Функция начинает искать заданный файл в следующем порядке:

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

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

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

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

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

Все это произойдет, если в pszCommandLine не указан полный путь до EXE-файла и если pszApplicationName = NULL.

psaProcess, psaThread – атрибуты защиты для процесса и

lпервичного потока.

bInheritHandles – флаг наследования.

fdwCreate – определяет флаги, влияющие на то, как именно создается новый процесс:

DEBUG_PROCESS – позволяет родительскому процессу проводить отладку всех дочерних процесса. Родительский процесс уведомляется о наступлении определенных событий.

DEBUG_ONLY_THIS_PROCESS – позволяет родительскому процессу проводить отладку только прямого потомка

CREATE_SUSPENDED – приостанавливает выполнение первичного потока

DETACHED_PROCESS – блокирует доступ процессу, инициированному консольной программой, к созданному родительским процессом консольному окну и сообщает системе, что вывод следует перенаправить в новое окно

CREATE_NEW_CONSOLE – приводит к созданию нового консольного окна

CREATE_NO_WINDOW – не дает создавать консольное окно

CREATE_NEW_PROCESS_GROUP – служит для модификации списка процессов, уведомляемых о нажатии клавиш Ctrl+C и Ctrl+Break. Если в системе одновременно исполняется несколько CUI-процессов, то при нажатии одной из этих комбинаций система уведомляет об этом только процессы, включенные в группу.

CREATE_DEFAULT_ERROR_MODE – запрещает наследования режимов обработки событий.

CREATE_SEPARATE_WOW_VDM – используется для запуска 16-разрядных приложений в Windows NT. Заставляет открывать для процесса отдельную Virtual DOS-machine (VDM). CREATE_SHARED_WOW_VDM 

– имеет обратное действие.

CREATE_UNICODE_ENVIRONMENT – определяет, что переменные окружения содержат Unicode-символы. По умолчанию ANSI символы.

Параметр fdwCreate разрешает задать и класс приоритета процесса:

IDLE_PRIORITY_CLASS

BELOW_NORMAL_PRIORITY_CLASS

NORMAL_PRIORITY_CLASS

ABOVE_NORMAL_PRIORITY_CLASS HIGH_PRIORITY_CLASS

REALTIME_PRIORITY_CLASS

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

pszCurDir – позволяет установить текущий диск и каталог для создаваемого процесса. Если NULL, то текущий каталог и диск устанавливается такой же, как и у родительского процесса.

lpsiStartInfo – элементы данной структуры определяют различные атрибуты при создании нового процесса. Обычно используются атрибуты по умолчанию, поэтому необходимо заполнить данную структуру нулями и записать в psiStartInfo размер структуры.

  STARTUPINFO si = { sizeof(si) }; CreateProcess(.. , &si, ...};

Параметр ppiProcInfo указывает на структуру PROCESS_INFORMATION, которую Вы должны предварительно создать; ее элементы инициализируются самой функцией CreateProcess. Структура представляет собой следующее

typedef struct _PROCESS_INFORMATION {

HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessId;

DWORD dwThreadId;

} PROCESS_INFORMATION;

typedef struct _PROCESS_INFORMATION {

HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessId;

DWORD dwThreadId;

} PROCESS_INFORMATION;

hProcess, hThread – описатели процесса и первичного потока,
dwProcessId, dwThreadId – уникальные (в рамках ОС!) идентификаторы процесса и потока.

Пример создания потока:

STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR szCommandLine[] = TEXT("NOTEPAD");
if (CreateProcess(

NULL,  // pszApplicationName

szCommandLine, // pszCommandLine

NULL, // psaProcess

NULL, // psaThread

FALSE, // bInheritHandles

NORMAL_PRIORITY_CLASS, // fdwCreate

NULL, // pvEnvironment

NULL, // pszCurDir

&si, // psiStartInfo

&pi);)

{printf(“ID процесса ”+IntToHex(pi.dwProcessId,32));

 printf (“ID потока “+IntToHex(pi.dwThreadId,32);}

 
 
 
 
 
 
 
 
 
 

27.12.2015; 15:54
хиты: 1
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2016. All Rights Reserved. помощь