Процессы


Процесс в Win32- зто участок памяти, занимаемый программой, сам по себе процесс является инертным, он ничем не владеет. Для того чтобы процесс заработал, в нём необходимо создать поток. ОС создаёт главный или первичный поток процесса, с этого момента поток начинает выполняться. Первичный поток задаётся WinMain. После завершения первичного потока ОС освобождает ресурсы, принадлежащие этому процессу. Внутри процесса могут быть созданы вторичные потоки, для каждого из них выделяется свой блок данных процесса. Если у процесса нет ни одного потока, то ОС уничтожает этот процесс.
Первичный поток процесса.
Описывается функцией WinMain.
Int WINAPI WinMain(
HINSTANCE hInstExe,
HINSTANCE hInstPrev,
LPSTR LpszCmdLine
INT nCmdShow
)
hInstExe – описатель процесса, hInstPrev – описатель предыдущей копии(в Win32 он всегда NULL),LpszCmdLine – командная строка,nCmdShow – показывает с какими характеристиками создано окно приложения.
Замечание: Влюбой момент работы программы можно получить описатель своего процесса, припомощи вызова фунсции HANDLE GetCurrentProcess(void); и указатель на командную строку LPSTR GetCommandLine(void).

Функция СreateProcess(
LPCTSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITYATTRIBUTES lpProcessAttributes,
LPSECURITYATTRIBUTES lpThreadAttributes,
BOOL InheritHandle,
DWORD CreationFlags,
LPVOID lpEnviroment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartUpInfo,
LPPROCESS_INFORMATION lpProcessInformation,
)
1-Имя приложения.2- Имя командной строки. 3-Атрибуты безопасности.4-Наследование.(3.4 Будет создан новый поток, нужно ли наследовать описатели.) 5-Родительские процессы. 6- Флаги создания.7-Указатель на блок переменных окружения. 8- Текущий каталог для данного процесса.
В структуре lpStartUpInfo описываются параметры с которыми должно быть создано главное окно.(Шрифт, цвет, размер).
В структуру lpProcessInformation возвращаются описатели созданных процессов и потоков.
typedef struct_PROCESS_INFORMATION
{
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessID;
DWORD dwThreadID;
} PROCESS_INFORMATION;
1- Содержит описатель процесса, который будет создан.2- Содержит описатель созданного потока. 3.4- ID- для созданного процесса и потока соответственно.
Пример.
# include<windows.h>
int WINAPI WinMain(HINSTANCE hExe, HINSTANCE hExePrev,LPSTR CLine,INT CmdShow)
{
STARTUPINFO si;
SECURITYATTRIBUTES saP,saT;
PROCESS_INFORMATION piB,piC;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
saP.nLenght=sizeof(saP);
saP.lpSecondaryDescription=NULL;
saP.bInheritHandle=TRUE;
ZeroMemory(&saT,sizeof(saT));
saT.nLenght=sizeof(saT);
CreateProcess(NULL,”far.exe”,&saP,&saT,FALSE,0,NULL,NULL,&si,&piB);
CreateProcess(NULL,”far.exe”,&saP,&saT,FALSE,0,NULL,NULL,&si,&piC);
Return 0;
}
Завершение процесса
1.При завершении процесса:
— все потоки прекращаются.
— Уничтожаются все объекты ядра и GDI
— Процесс переходит в свободное состояние.
— Код завершения становится равным fuExitCode.
— Счетчик объектов ядра «процесс» уменьшается на 1.
2.Способы завершения процессов.
— нормальное завершение- вызов функции ExitProcess
void ExitProcess ( uint fuexitCode) – завершает поток с кодом
Замечание : любой вызов ExitProcess приводит к завершению первичного потока процесса.
Если приложение является многопоточным и вспомогательные потоки не отрабатывают до конца, то может произойти некорректное завершение неотработавших до конца вторичных потоков.
Рекомендуется: вызывать функцию ExitProcess, только проверив, что все порожденные потоки завершили работу.
— Если необходимо завершить другой процесс вызывается функция:
BOLL TerminateProcess(HANDLE hProc,UINT fuExitCode)
Вызов функции позволяет завершить аварийно др. процесс. Желательно избегать, т.к. м-б связано с потерей резурсов.
— Все потоки процесса завершаю свою работу самостоятельно.
Создани и управление вторичными потоками.
HANDLE CreateThread(
LPSECURITYATTRIBUTES lpsa;
DWORD dwStackSize,
LPTHREAD_START_ROTINE lpStartAdress,
LPVOID lpParametr,
DWORD CreationFlags,
LPDWORD lpThreadID)
3-Адресс функции потока-передаём указатель на функцию. Её прототип: DWORD WinAPI ThreadFunc(LPVOID);
4- Пользовательский параметр для функции потока.
5-Флаги создания.
Достпный флаг CREATE_SUSPENDED- вновь созданный поток находится в состоянии ожидания. Ф-ция ThreadFunc не выполняется.
6-Указатель на переменну, в которую будет помещен указатель созданного потока. В большинстве случаев он не нужен.
Функция позволяющая поток.
DWORD ResumeThread(HANDLE hThread)
Функция приостановления.
DWORD SuspendThread(HANDLE hThread)

Загрузка...