Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab5.doc
Скачиваний:
2
Добавлен:
12.11.2019
Размер:
376.32 Кб
Скачать

25

Министерство образования и науки Российской Федерации

Казанский государственный технический университет

имени А.Н. Туполева

____________________________________________

Межкафедральный филиал факультета № 4 в ОАО ICL-КПО ВС

Р.Ф. Миннибаев

Методическое руководство к

лабораторной работе

“ Работа с процессами”

по дисциплине “Системное программирование”

КАЗАНЬ 2004

Содержание

1. Понятие процесса. 3

2. Типы приложений под Windows 4

3.Описатель экземпляра процесса 5

4.Описатель предыдущего экземпляра процесса 6

5.Командная строка процесса 6

6.Переменные окружения 6

7.Текущие диск и каталог для процесса 8

8.Текущие каталоги для процесса 9

9.Создание процесса - функция CreateProcess 9

9.1. Параметры pszApplicationName и pszCommandLine 10

9.2. Параметры psaProcess, psaThread и blnheritHandles 11

9.3. Параметр fdwCreate 12

9.4. Параметр pvEnvironment 14

9.5. Параметр pszCurDir 15

9.6. Параметр psiStartlnfo 15

9.7. Параметр ppiProclnfo 18

10. Завершение процесса 20

10.1. Возврат управления входной функцией первичного потока 20

10.2. Функция ExitProcess 20

10.3. Функция TerminateProcess 21

10.4.Завершение всех процессов потока 22

11. Порядок завершения процесса 22

14. Дочерние процессы 23

15. Запуск обособленных дочерних процессов 24

16. Порядок выполнения работы 24

17. Контрольные вопросы 25

1. Понятие процесса.

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

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

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

Рис. 1.1 Операционная система выделяет потокам кванты времени по принципу карусели

Процессы инертны. Чтобы процесс что-нибудь выполнил, в нем нужно создать поток. Именно потоки отвечаю за исполнение кода, содержащегося в адресном пространстве процесса. В принципе, один процесс может владеть несколькими потоками, и тогда они "одновременно" исполняют код в адресном пространстве процесса.

Для этого каждый поток должен располагать собственным набором регистров процессора и собственным стеком. В каждом процессе есть минимум один поток. Если бы у процесса не было ни одного потока, ему нечего было бы делать на этом свете, и система автоматически уничтожила бы его вместе с выделенным ему адресным пространством.

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

При создании процесса первый (точнее, первичный) поток создается системой автоматически. Далее этот поток может породить другие потоки, те в свою очередь — новые и т. д.

Замечание: Windows 2000 в полной мере использует возможности машин с несколькими процессорами. Ядро Windows 2000 полностью поддерживает распределение процессорного времени между потоками и управление ими на таких системах.

Windows 98 работает только с одним процессором. Даже если у компьютера несколько процессоров, под управлением Windows 98 действует лишь один из них — остальные простаивают.

2. Типы приложений под Windows

Windows поддерживает два типа приложений: основанные на графическом интерфейсе (graphical user interface, GUI) и консольные (console user interface, CUI). В приложениях первого типа внешний интерфейс чисто графический GUI-приложения создают окна, имеют меню, взаимодействуют с пользователем через диалоговые окна и вообще пользуются всей стандартной "Windows'oвской" начинкой. Почти все стандартные программы Windows — Notepad, Calculator, Wordpad и другие — являются GUI-приложениями. Приложения консольного типа работают в текстовом режиме: они не формируют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные приложения на экране тоже размещаются в окне, в нем содержится только текст. Командные процессоры вроде Cmd.exe (в Windows 2000) или Command.com (в Windows 98) — типичные образцы подобных приложений.

Вместе с тем граница между двумя типами приложений весьма условна. Можно, например, создать консольное приложение, способное отображать диалоговые окна. Скажем, в командном процессоре вполне может быть специальная команда, открывающая графическое диалоговое окно со списком команд, вроде мелочь — а избавляет от запоминания лишней информации. В то же время можно создать и GUI-приложение, выводящее текстовые строки в консольное окно. Но, конечно, графический интерфейс предпочтительнее, чем старомодный текстовый. Как показывает опыт, приложения на основе GUI "дружественнее" к пользователю, а значит и более популярны.

При создании проекта приложения, Microsoft Visual C++ устанавливает такие ключи для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы. Для CUI-программ используется ключ /SUBSYSTEM:CONSOLE, а для GUI-приложений — /SUBSYSTEM:WINDOWS. Когда пользователь запускает приложение, загрузчик операционной системы проверяет номер подсистемы, хранящийся в заголовке образа исполняемого файла, и определяет, что это за программа — GUI или CUI. Если номер указывает на приложение последнего типа, загрузчик автоматически создает текстовое консольное окно, а если номер свидетельствует о противоположном — просто загружает программу в память. После того, как приложение начинает работать, операционная система больше не интересуется, к какому типу оно относится.

Во всех Windows-приложениях должна быть входная функция за реализацию которой отвечает разработчик. Существует четыре такие функции:

  1. int WINAPI WinMain( HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow);

  2. int WINAPT wWinMain( HINSTANCE hinstExe, HINSTANCE, PWSTR pszCmdLine, int nCmdShow);

  3. int __cdecl main( int argc, char *argv[], char *envp[]);

  4. int _cdecl wmain( int argc, wchar_t *argv[], wchar_t *envp[]);

Одна из частых ошибок, допускаемых теми, кто лишь начинает работать с Visual С++, — выбор неверного типа проекта. Например, разработчик хочет создать проект Win32 Application, а сам включает в код функцию main. При его сборке он получает сообщение об ошибке, так как для проекта Win32 Application в командной строке компоновщика автоматически указывается ключ /SUBSYSTEM:WlNDOWS, который требует присутствия в коде функции WinMain или wWinMatn. В этот момент разработчик может выбрать один из четырех вариантов дальнейших действий:

  • заменить main на WinMain. Как правило, это не лучший вариант, поскольку разработчик скорее всего и хотел создать консольное приложение,

  • открыть новый проект, на этот раз — Win32 Console Application, и перенести в него все модули кода.

  • открыть вкладку Link в диалоговом окне Project Settings и заменить ключ /SUBSYSTEM:WINDOWS на /SUBSYSTEM:CONSOLE. Некоторые думают, что это единственный вариант,

  • открыть вкладку Link в диалоговом окне Project Settings и вообще убрать ключ /SUBSYSTEM:WINDOWS. Этот способ самый гибкий. Компоновщик сам сделает все, что надо, в зависимости от входной функции, которая реализуется в коде.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]