
- •Порядок выполнения работы
- •Контрольные вопросы
- •Что происходит при запуске процесса?
- •Как реализуется многозадачность под Windows?
- •Какие типы приложений бывает под Windows?
- •Параметры psaProcess, psaThread и blnheritHandles
- •Каким образом можно отследить, когда дочерний процесс завершил работу?
- •Как запустить обособленный дочерний процесс?
- •Файл child.Cpp
Что происходит при запуске процесса?
При создании процесса первый (точнее, первичный) поток создается системой автоматически. Далее этот поток может породить другие потоки, те в свою очередь — новые и т. д.
Подробнее. Когда поток в приложении вызывает CreateProcess, система создает объект ядра «процесс» с начальным значением счетчика числа его пользователей, равным 1. Этот объект — не сам процесс, а компактная структура данных, через которую операционная система управляет процессом. (Объект ядра "процесс" следует рассматривать как структуру данных со статистической информацией о процессе.) Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные как для исполняемого файла, тaк и для любых DLL (если таковые требуются).
Далее система формирует объект ядра "поток" (со счетчиком, равным 1) для первичного потоки нового процесса. Как и в первом случае, объект ядра "поток" — это компактная структура данных, через которую система управляет потоком. Первичный поток начинает с исполнения стартового кода из библиотеки С/С++, который в конечном счете вызывает функцию WinMain, wWinMain, main или wmain в программе. Если системе удастся создать новый процесс и его первичный поток, CreateProcess вернет TRUE.
Как реализуется многозадачность под Windows?
Поскольку Windows поддерживает истинную вытесняющую многозадачность, можно запустить одно приложение и, пока оно инициализируется, поработать с другой программой. Для визуальной обратной связи с пользователем функция CreateProcess временно изменяет форму системного курсора мыши:
Курсор такой формы подсказывает: можно либо подождать чего-нибудь, что вот вот случится, либо продолжить работу в системе. При установленном флаге STARTF_FORCEOFFFEEDBACK, CreateProcess не станет добавлять "песочные часы" к стандарт ной стрелке.
Флаг STARTF_FORCEONFEEDBACK заставляет CreateProcess отслеживать инициализацию нового процесса и в зависимости от результата проверки изменять форму курсора. Когда функция CreateProcess вызывается с этим флагом, курсор преобразуется в «песочные часы». Если спустя две секунды от нового процесса не поступает GUI-вызов, она восстанавливает исходную форму курсора.
Если же в течение двух секунд процесс все же делает GUI-вызов, CreateProcess ждет, когда приложение откроет свое окно. Это должно произойти в течение пяти секунд после GUI-вызова Если окно не появилось, CreateProcess восстанавливает курсор, а появилось — сохраняет его в виде «песочных часов» еще на пять секунд Как только приложение вызовет функцию GetMessage, сообщая тeм самым, что оно закончило инициализацию, CreateProcess немедленно сменит курсор на стандартный и прекратит мониторинг нового процесса.
Какие типы приложений бывает под 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 "дружественнее" к пользователю, а значит и более популярны.
Как программно запустить процесс?
Для создания процесса используется функция CreateProcess.
BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSFCURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThiead, BOOL bInheritHandles, DWORD fdwCreate, PVOID pvEnvironment, PCTSTR pszCurDir, PSTARTUPINFO psiStartInfo, PPROCESS_INFORMATION ppiProcInfo);
Какое окружение существует у процесса?
С любым процессом связан блок переменных окружения — область памяти, выделенная в адресном пространстве процесса. Каждый блок содержит группу строк такого вида:
VarName1=VarValue1\0 VarName2=VarValue2\0 VarName3=VarValue3\0 ... VarNameX=VarValueX\0
\0
Первая часть каждой строки — имя переменной окружения. Зa ним следует знак равенства и значение, присваиваемое переменной. Строки в блоке переменных окружения должны быть отсортированы в алфавитном порядке по именам переменных.
Знак равенства разделяет имя переменной и ее значение, так что его нельзя использовать как символ в имени переменной. Важную роль играют и пробелы. Например, объявив две переменные.
XYZ= Windows (обратите внимание на пробел за знаком равенства) ABC=Windows
и сравнив значения переменных ХУZ и АВС, нетрудно заметить, что система их различает, — она учитывает любой пробел, поставленный перед знаком равенства или после него.
Вот что будет, если записать, скажем, так
XYZ =Home (обратите внимание на пробел перед знаком равенства) XYZ=Work
Первую переменная будет с именем "XYZ", содержать строку "Home", а вторая переменная "XYZ ", содержать строку "Work".
Конец блока переменных окружения помечается дополнительным нулевым сим волом.
Какие параметры влияют на запуск процесса?