Цель работы
Изучение методов и средств порождения процессов и нитей.
Изучение способов синхронизации процессов и нитей через ожидание окончания их
выполнения.
Список используемых системных вызовов
CloseHandle, CreateProcess, CreateThread, ExitProcess,
ExitThread, GetCommandLine, GetCurrentProcess, GetCurrentProcessId,
GetCurrentThread, GetCurrentThreadId, GetExitCodeProcess, OpenProcess,
OpenThread, ResumeThread, SuspendThread, Sleep, ThreadProc, TerminateProcess,
TerminateThread, WaitForSingleObject, WaitForMultipleObjects.
Методические указания
Выбор между консольным и оконным приложением выполняется по
согласованию с преподавателем. Эмуляцию работы процесса следует выполнять с
помощью функции Sleep.
Для использования функций Win32 API
достаточно подключить заголовочный файл windows.h
#include
<windows.h>
Для порождения нового процесса используется функция CreateProcess.
При этом порождается процесс и одна начальная нить. После создания процесса
параметр lpProcessInformation
(адрес структуры PROCESS_INFORMATION)
заполняется значениями идентификаторов и дескрипторов процесса и начальной
нити. Дескрипторы следует закрыть сразу после того, как они становятся не
нужны, с помощью функции CloseHandle.
Процесс может создавать дополнительные нити с помощью
функции CreateThread. Основная
функция порожденной нити вызовется средствами операционной системы. Такие
функции называются callback-функциями.
Нить процесса можно породить в приостановленном состоянии.
Для этого в параметре dwCreationFlags
следует установить бит CREATE_SUSPENDED. Останов и возобновление работы нити
можно также производить с помощью функций SuspendThread,
ResumeThread.
Процесс завершается в следующих случаях:
-
Вызовом функции ExitProcess,
либо выходом из функции WinMain
или main;
-
Вызовом функции ExitThread для
каждой нити процесса, либо выходом из основной функции нити;
-
Уничтожением всех нитей процесса с помощью
функции TerminateThread (не
рекомендуется);
-
Уничтожением процесса с помощью функции TerminateProcess.
Нити и процессы можно синхронизировать, используя группу WaitFor-функций (WaitForSingleObject, WaitForMultipleObjects и др.).
По завершению процесса или нити эти функции возвращают значение WAIT_OBJECT_0.
Задания
Разработать менеджер процессов, уничтожающий процессы,
выполняющиеся дольше заданного срока.
Листинг
программы.
#include
<stdio.h>
#include
<windows.h>
#include
<ostream.h>
DWORD
WINAPI MyThread(LPVOID lpParam);
DWORD
WINAPI MyThreadSl(LPVOID lpParam);
void main()
{
HANDLE hThread, hThreadSl;
int k;
do
{
printf("\nInput the
number of threads: ");
scanf("%d",&k);
fflush(stdin);
}
while(k<=0);
//порождаем
к процессов
while(k>0)
{
hThread =
CreateThread(NULL, 0, MyThread,
(LPVOID)k, 0,
NULL);
if(hThread==NULL)
{
printf("\nError
create thread!!!");
exit(0);
}
//создаем
еще один процесс для слежения за существующим
hThreadSl = CreateThread(NULL, 0,
MyThreadSl,
(LPVOID)hThread,
0, NULL);
if(hThreadSl==NULL)
{
printf("\nError
create thread!!!");
exit(0);
}
CloseHandle(hThreadSl);
k--;
}
while(!getchar()){};
CloseHandle(hThread);
}
DWORD
WINAPI MyThread(LPVOID lpParam)
{
int k=(int)lpParam;
printf("\nProcess number %d is
run!!!!",k);
Sleep(1000*(k));
printf("\nProcess number %d is
stop!!!!",k);
return 0;
}
DWORD
WINAPI MyThreadSl(LPVOID lpParam)
{
//DWORD dwThreadId = (DWORD)lpParam;
HANDLE myproc = (HANDLE)lpParam;;
//если превышено время
ожидания заврешения процесса, то прибить его
if(WaitForSingleObject(myproc,3000)==
WAIT_TIMEOUT)
if(TerminateThread(myproc,0)!=0)
printf("\nProcess
KILLED!!! for time out!!!");
return
0;
}
Вывод: изучили методы и средства порождения
процессов и нитей, а также изучили
способы синхронизации процессов и нитей через ожидание окончания их выполнения.
Комментариев нет:
Отправить комментарий