Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ОС(СПО) Даниленко.pdf
Скачиваний:
69
Добавлен:
13.05.2015
Размер:
816.02 Кб
Скачать

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.Какие вспомогательные этапы выполняет операционная система при завершении процесса, при его блокировании, во время запуска (перевода из состояния «готовность» в состояние выполнение)? Можно ли получить временные характеристики процесса уже после его завершения?