- •Содержание
- •Введение
- •1. Командный интерпретатор Windows и командные файлы
- •1.1. Общие сведения
- •1.2. Задание
- •1.3. Контрольные вопросы
- •2. Создание процессов с использованием Windows API
- •2.1. Общие сведения
- •2.2. Задание
- •2.3. Контрольные вопросы
- •3. Многопоточность в Windows
- •3.1. Общие сведения
- •3.2. Задание
- •3.3. Контрольные вопросы
2. Создание процессов с использованием Windows API
Цель работы: изучить функции и структуры данных Windows API, используемые для создания и завершения процессов, исследовать возможности получения доступа к управлению процессами.
2.1. Общие сведения
Краткие сведения о средах разработки. Выполнение работ 2-6
можно осуществлять в любой среде, поддерживающей разработку приложений под Windows: C++ Builder, Dev C++, Visual Studio, Turbo C++ Explorer и др. Принцип создания проекта консольного приложения в среде Visual Studio представлен в приложении Б.
Перечисленные среды позволяют создавать как приложения, ориентированные на использование графического интерфейса, так и консольные, использующие интерфейс командной строки. При изучении многих механизмов функционирования ОС Windows не требуется прибегать к использованию графического интерфейса, поэтому лабораторные работы будут ориентированы на создание консольных приложений. Для полноценного использования прикладного интерфейса Windows, разработчики среды предоставляют возможность использование модулей, в которых содержатся объявления системных вызовов Windows (для использования большинства достаточно подключить заголовочный файл «windows.h»).
Операции над процессами. Для создания процессов в Windows
могут использоваться системные вызовы WinExec, ShellExecute и CreateProcess. Описание этих функций (и других, упомянутых ниже) находится в Приложении А (более подробную информацию можно найти в справочной системе MSDN или Windows SDK). С помощью каждой из указанных функций можно создать новый процесс, однако наибольшие возможности по управлению создаваемым процессом предоставляет CreateProcess, в результате выполнения которой заполняется структура данных, содержащая идентификатор и дескриптор процесса, идентификатор и дескриптор главного потока процесса.
Большинство операций над процессами требуют в качестве фактического параметра дескриптор процесса. В случае, когда идентификатор процесса известен, можно получить дескриптор процесса, используя функцию OpenProcess. Зная дескриптор, можно, например, получить статистическую информацию о процессе
(GetProcessTimes) или завершить процесс (TerminateProcess).
Для того чтобы в ходе работы приложения не наблюдалось так назы-
ваемой «утечки памяти», каждый открытый дескриптор должен быть закрыт, если его дальнейшее использование не предусматривается.
2.2. Задание
Разработать и отладить программу, выполняющую следующие функции:
1.создание процесса с помощью одной из трех функций по выбору пользователя (в качестве исполняемого модуля можно использо-
вать, например, notepad.exe);
2.определение дескриптора созданного процесса по идентификатору: для процессов, созданных с использованием WinExec и ShellExecute, идентификатор задается пользователем на основе сведений, предоставляемых «Диспетчером процессов» (или с помощью утилиты tasklist в Windows XP и более поздних версиях); для процесса, созданного с использованием CreateProcess, значение идентификатора определяется соответствующим полем структуры PROCESS_INFORMATION (сравнить это значение со значением идентификатора из «Диспетчера процессов»);
3.проверка уникальности дескрипторов процессов;
4.получение значений временных характеристик процесса;
5.завершение процесса и закрытие открытых ранее дескрипторов;
6.проверка успешности выполнения операций над процессами;
7.занесение результатов выполнения каждого шага программы в файл log.txt (данный пункт не обязателен, контролировать выполнение программы можно с использованием отладчиков и/или путем вывода результатов выполнения, в том числе промежуточных, на экран).
2.3. Контрольные вопросы
1.Дайте определения понятиям «процесс» и «поток».
2.В чем сходство и отличие между идентификатором процесса
(process identifier) и дескриптором процесса (process handle)?
3.Что означают понятия «пользовательский режим» и «привилегированный режим»?
4.Каким образом пользовательские процессы могут выполняться в режиме ядра?
5.Чем может быть обусловлена большая разница между временем существования процесса и его временем работы, в случае если процесс представляет интерактивное приложение?
6.Могут ли наследоваться ресурсы процесса? Как задается режим наследования?
7.Какой ресурс операционная система распределяет между потоками, а не между процессами?
8.Какие вспомогательные этапы выполняет операционная система при завершении процесса, при его блокировании, во время запуска (перевода из состояния «готовность» в состояние выполнение)? Можно ли получить временные характеристики процесса уже после его завершения?