Процессы в ОС Windows: создание и завершение процессов, основные функции работы с процессами.


Для создания процесса используется функция
BOOL CreateProcess(
LPCTSTR lpAppName,
LPCTSTR lpCommandLine,
LPSICURITY_ATTRIBUTES lpProcAttr,
LPSICURITY_ATTRIBUTES lpThreadAttr,
BOOL bInheritHandle,
LPVOID lpEnvironment,
LPCTSTR lpCurDir,
LPSTaRTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcInfo)
lpAppName — путь к файлу программы,
lpCommandLine — параметры командной строки,
lpProcAttr — атрибуты безопасности,
bInheritHandle —наследование описателей помеченных как наследуемые,
CreationFlags — флаги создания процессов,
lpEnvironmen — набор переменных окружения нового процесса. Создаются следующим образом: сначала идёт набор переменных окружения для всей системы, потом для данного пользователя. Если указать NULL, возьмётся набор переменных из текущего процесса.

lpCurDir — текущий каталог процесса. Если сюда передать NULL, то стартом текущего каталога будет каталог, в котором расположен exe-файл.
typedef struct PROCESS_INFORMATION
            HANDLE nProcess;
            HANDLE hThread;
            DWORD dwProcessId;
            DWORD dwThreadId;
            } PROCESS_INFORMATION;
Структуру startupInfo можно заполнить нулями: она отвечает за установки окна приложения. Тогда все параметры будут браться по умолчанию.
Флаги функции CreateProcess:
      CREATE_NEW_CONSOLE — процесс в новой консоли,
      CREATE_SUSPENDED — процесс создается но не запускается,
      DEBUG_PROCESS — отладка всего дерева нижележащих процессов,
      DEBUG_ONLY_THIS_PROCESS - отладка только созданного процесса.
Если указан параметр CommandLine, то ОС будет искать исполняемый файл в следующих каталогах:
1)    там же, где и испольняемый файл вызывающего процесса
2)    текущий каталог исп. файла
3)    системный каталог Windows
4)    основной каталог Windows
5)    там куда указывает переменная окружения PATH данного процесса
Если указан AppName то ищется только в 1 и 2
По возврату из функции CreatProcess, если не требуется использовать описатели и нити, их нужно закрыть с помощью спец. функции:
BOOL CloseHandle(HANDLE hObject)
Условие завершения процесса:
1)    одна из нитей процесса вызвала функцию void ExitProcess(DWORD dwExitCode)
2)    одна из нитей другого процесса вызывает функцию BOOL TerminateProcess(Handel hProcess, DWORD dwExitCode)
3)    основная нить процесса выходит из функции main. В результате вызовется функция ExitProcess.
4)    каждая нить процесса вызывает функцию ExitThread(DWORD dwExitCode)


Оптимальный способ завершения процесса: все нити процесса, кроме первой, вызывают фукнцию ExitThread либо выходят из основной функции нити. Основная нить выходит из функции main. В этом случае гарантируется, что не будет потеря данных.

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

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