Организация мультизадачности для приложений WIN32
Каждый раз при создании нового процесса, и, в частности, при исполнении стартового кода функции WinMain, вызывается функция API WIN32 CreateProcess:
BOOL CreateProcess( LPCTSTR lpApplicationName, // имя запускаемого модуля (exe-файла)
LPTSTR lpCommandLine, // указатель на строку с параметрами запуска
LPSECURITY_ATTRIBUTES lpProcessAttributes, // указатель на атрибуты безопасности
// процесса
LPSECURITY_ATTRIBUTES lpThreadAttributes, // указатель на атрибуты безопасности
// первичного потока
71
BOOL bInheritHandles, // флаг наследования идентификаторов процесса и потока
DWORD dwCreationFlags, // флаги создания процесса
LPVOID lpEnvironment, // указатель на блок окружения процесса
LPCTSTR lpCurrentDirectory, // путь к текущему каталогу
LPSTARTUPINFO lpStartupInfo, // указатель на структуру STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // указатель на структуру
// PROCESS_INFORMATION );
Эта функция создает для нового процесса виртуальное адресное пространство, создает объект ядра процесс с начальным значением счетчика, равным единице, переводит объект ядра в состояние nonsignaled и вызывает функцию CreateThread для создания первичного потока, соответствующего коду функции WinMain. В случае успешного создания нового процесса функция CreateProccess возвращает значение TRUE.
Атрибуты безопасности задаются структурой SECURITY_ATRIBUTES и содержат дескриптор безопасности для создаваемого процесса и его первичного потока. Рекомендуется в качестве указателя на эту структуру в параметрах рассматриваемой функции использовать NULL. В этом случае атрибуты безопасности автоматически определяются системой. Флаг наследования определяет, будет ли новый процесс наследовать идентификаторы родительского процесса и его первичного потока. Флаги создания процесса воздействуют на способ создания и приоритет нового процесса. В частности, имеется возможность создать процесс и сразу его заблокировать, отложив инициализацию первичного потока. Затем его можно будет возобновить при помощи функции ResumeThread. Можно также запустить процесс в режиме отладки, что обычно используется отладчиками, запускающими отлаживаемую программу в качестве дочернего процесса. Четыре флага (IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS и REALTIME_PRIORITY_CLASS) задают класс приоритета нового процесса. Самый низкий класс приоритета IDLE, самый высокий – REALTIME, прикладные процессы обычно имеют класс приоритета NORMAL. Структура STARTUPINFO определяет вид главного окна нового процесса после запуска. В структуре PROCESS_INFORMATION ОС возвращает идентификаторы нового процесса и первичного потока, а также идентификаторы объектов ядра процесс и поток типа HANDLE. Более подробную информацию можно получить из справочной документации или электронного справочника WIN32 Programmer’s Reference.
предыдущаяследующая