Студопедия

Главная страница Случайная страница

Разделы сайта

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






Завершение процесса






Не нужно, однако, путать закрытие дескриптора процесса и завершение самого процесса. В первом случае мы просто отказываемся от доступа к процессу, сам процесс при этом не уничтожается (на то у него есть еще одна единичка в счетчике жизни) и вполне может продолжать работу. Завершение работы процесса может произойти в одном из четырех случаев:

· входная функция первичного потока (обычно это main, wmain, WinMain или wWinMain) возвращает управление;

· один из потоков процесса вызывает функцию ExitProcess;

· процесс другого потока вызывает функцию TerminateProcess;

· все потоки процесса умирают.

Из всего этого многообразия лучшим вариантом является первый. Только этот способ гарантирует, что ваша программа завершилась корректно. Конечно, Windows в любом случае освободит все использованные вашей программой ресурсы, однако при аварийном завершении процесса не будут, например, выполнены деструкторы объектов C++, что может привести к не сохраненным пользовательским данным, не записанным изменениям в конфигурации и так далее. Библиотека C++ (да и любого другого языка) на самом деле выполняет довольно много полезных операций, как перед стартом вашей программы, так и после ее завершения, и не надо мешать ей это делать. Библиотека сама вызовет ExitProcess, когда этому придет время.

Если же все-таки возникла необходимость аварийно завершить процесс, то мы можем воспользоваться функциями ExitProcess или TerminateProcess. Первая из этих функций уничтожает тот процесс, который ее вызвал, а вторая позволяет завершить любой процесс в системе (если конечно к нему есть доступ), указав его дескриптор. Обе функции позволяют установить код возврата процесса. После вызова этих функций наш процесс прекратит свое существование, все системные ресурсы будут освобождены, однако возможности сохранить данные процесс не получит.

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

Заметим, что завершение родительского процесса в Windows не приводит к завершению запущенных им дочерних процессов.

При завершении процесса происходит следующее:

1. выполнение всех потоков в процессе прекращается;

2. все открытые процессом объекты USER и GDI уничтожаются, а объекты ядра закрываются;

3. код возврата процесса меняется со значения STILL_ACTIVE (0x103) на свое значение;

4. объект ядра «процесс» переходит в свободное (signaled) состояние (про это состояние будет рассказано в разделе про Wait-функции);

5. счетчик использования объекта «процесс» уменьшается на 1.

Если после выполнения этой операции счетчик использования процесса все еще не равен 0 (есть открытые дескрипторы в других процессах), то сам объект ядро не уничтожается. Однако использовать этот объект можно только для того, чтобы обращаться к Wait-функциями или получить код возврата, используя функцию GetExitCodeProcess. После того, как все оставшиеся дескрипторы будут закрыты, Windows уничтожит и сам объект «процесс».






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.