Лабораторная работа: Порождение и завершение процессов и нитей

Цель работы

Изучение методов и средств порождения процессов и нитей. Изучение способов синхронизации процессов и нитей через ожидание окончания их выполнения.

Список используемых системных вызовов

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;
}


Вывод: изучили методы и средства порождения процессов и нитей, а также  изучили способы синхронизации процессов и нитей через ожидание окончания их выполнения.

Комментариев нет:

Отправить комментарий