- процессы и потоки
- процесс
- Def: экземпляр выполняемой программы состоящий из двух компонентов
- объект ядра, через который система управляет процессом
- адресное пространство, а там уже все данные, стеки потоков и прочее
- ну и чтобы процесс что-либо делал у него должен быть как минимум один поток
- создается при помощи функции
- BOOL CreateProcess(
PCTSTR pszApplicationName, // если NULL то считает первый элемент commandLine за то, что нужно запускать
// если параметр задан и не содержит полный путь, то ищет файл ТОЛЬКО в текущем ктаалоге
// не дополняет расширение файла до .exe
PTSTR pszCommandLine, // указатель на командную строку. ВАЖНО! функция ее изменит но потом вернет к первозданному виду. Потому если она в read-only области то будет ошибка // и еще, тут подразумевается ПОЛНАЯ командная строка
// если расширение не указано, то ищет .exe
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate, // флаги создания нового процесса (новое окно, никаких окон, debug и прочее)
PVOID pvEnvironment, // переменные окружения
PCTSTR pszCurDir, // текущий катаог (важно, путь если дан то должен быть полным включая букву диска)
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
- а вот что она делает
- создает объект ядра Process, создает для него адресное пространство, загружает код, данные для EXE и всех других зависимостей
- потом создается объект ядра Thread, для главного потока. Надо помнить, что объект ядра это некоторая компактная структура через которую ОСь управляет процессом/потоком. Потом исполняется стартовый код и вызывается main
- ищет заданный в ней exe файл в папках
- каталог содержащий exe вызвавшего
- текущий каталог вызвавшего процесса
- системный каталог Windows
- основной каталог Windows
- Каталоги из PATH
- способы завершения
- основной поток завершается - лучший способ, далее CRTStartup подчищает все, что наинициализировала и вызывает ExitProcess
- ExitProcess (из себя) или TerminateProcess (из другого) - относительно аварийный выход, система все подчистит, но все равно не айс, деструкторы объектов построенных во время выполнения и CRTStartup не уничтожаются...
- все потоки ушли (ч-з Exit/Terminate Thread) - редкий способ, в таком случае код завершения процесса это код завершения последнего потока
- что происходит при завершении
- останавливаются все выполняемые потоки
- все User и GDI объекты уничтожаются, все объекты ядра закрываются
- состояние процесса помечается как signaled (special for wait-функций)
- счетчик объекта ядра процесс уменьшается на 1
- поток
- сущность, выполняющая собственно код
- имеет собственный набор регистров процессора и стек
- максимальное кол-во ~2000 для одного процесса (на моем компе мне удалось сделать 1451 поток)
- APC
- возможность привести поток в wait alertable и в такие потоки можно при помощи QueueUserAPC встраивать выполнение нужной тебе процедуры.
- DWORD QueueUserAPC(
PAPCFUNC, // указатель на процедуру
HANDLE, // хэндл потока
ULONG_PTR // параметр процедуры
)