Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Создание и завершение процессов.




Процесс создается при вызове приложением функции CreateProcess:


BOOL CreateProcess (

1)PCTSTR pszApplicationName,

2)PTSTR pszCommandLine,

3)PSECURITY_ATTRIBUTES psaProcess,

4)PSECURITY_ATTRIBUTES psaThread,

5)BOOL bInhentHandles,

6)DWORD fdwCreate,

7)PVOID pvEnvironment,

8)PCTSTR pszCurDir,

9)PSTARTUPINFO psiStartInfo,

10)PPROCESS_INFORMATION ppiProcInfo);

 

 

1) имя исполняемого файла, которым будет пользоваться новый процесс

2) командную строку, передаваемую этому процессу.

3)4) дискрипторы защиты

5) наследовать или нет дискрипторы

(FALSE || 0)

6) флаги создания

7) получение блока переменных окружения (NULL – как родительский)

8) текущая дериктория (NULL – как родительский)

9) указатель на структуру

10) выходной параметр


Когда поток в приложении вызывает CreateProcess, система создает объект ядра “процесс” с начальным значением счетчика числа его пользователей, равным 1. Этот объект — не сам процесс, а компактная структура данных, через которую операционная система управляет процессом. Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные для исполняемого файла.

Далее система формирует объект ядра “поток” (со счетчиком, равным 1) для первичного потока нового процесса. Как и в первом случае, объект ядра “поток” — это компактная структура данных, через которую система управляет потоком. Первичный поток начинает с исполнения стартового кода из библиотеки C++, который в конечном счете вызывает функцию WinMain, wWinMain, main или wmain. Если системе удастся создать новый процесс и его первичный поток, CreateProcess вернет TRUE.

Процесс можно завершить четырьмя способами:

1.входная функция первичного потока возвращает управление (рекомендуемый способ).

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

1) любые С++-объекты, созданные данным потоком, уничтожаются соответствующими деструкторами;

2) система освобождает память, которую занимал стек потока;

3) система устанавливает код завершения процесса (поддерживаемый объектом ядра "процесс") — его и возвращает входная функция;

4) счетчик пользователей данного объекта ядра "процесс" уменьшается на 1.

2.один из потоков процесса вызывает функцию ExitProcess (нежелательный способ).

Процесс завершается, когда один из его потоков вызывает ExitProcess

VOID ExilProcess (UINT fuExitCode);

Эта функция завершает процесс и заносит в параметр fuExitCode код завершения процесса. Если за вызовом этой функции в программе присутствует какой-нибудь код, он никогда не исполняется. Вызов ExitProcess или ExitThread приводит к уничтожению процесса или потока, когда выполнение функции еще не завершилось.

3.поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно).

Вызов функции TerminateProcess тоже завершает процесс:

BOOL TerminateProcess (HANDLE hProcoss, UINT fuExitCode).

Главное отличие этой функции от ExitProcess в том, что ее может вызвать любой поток и завершить любой процесс. Параметр hProcess идентифицирует описатель завершаемого процесса, а в параметре fuExitCode возвращается код завершения процесса.

4.все потоки процесса умирают по своей воле (большая редкость).

В такой ситуации (а она может возникнуть, если все потоки вызвали ExitThread или их закрыли вызовом TermirmteThread) операционная система больше не считает нужным "содержать" адресное пространство данного процесса. Обнаружив, что в процессе не исполняется ни один поток, она немедленно завершает его. При этом код завершения процесса приравнивается коду завершения последнего потока.

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 148; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты