В чем разница между закрытием приложения и завершение процесса из Диспетчера задач?

в чем разница между убийством приложения с помощью кнопки "Закрыть" и завершение процесса из Диспетчера задач?

Я знаю о том, что нажатие кнопки закрытия сообщений a WM_CLOSE сообщение в очереди сообщений, но я не знаю, что происходит, когда мы убиваем процесс из Диспетчера задач (или любого подобного приложения, такого как Killbox или Process Explorer).

3 ответов


когда вы нажимаете кнопку " X " в строке заголовка окна приложения, которое отправляет окно WM_CLOSE. Это" изящное " завершение работы-приложение обрабатывает сообщение, обрабатывает любые необходимые задачи очистки и даже может отказать в закрытии, если захочет (вернув ноль в ответ на сообщение). WM_CLOSE Это просто запрос что окно или приложение завершаются; окно не уничтожается, пока само приложение вызывает DestroyWindow функции.

когда вы нажимаете кнопку "завершить задачу" в Диспетчере задач, Windows сначала попытается отправить приложение (если это приложение GUI) a WM_CLOSE сообщение. Другими словами, он сначала просит красиво и дает приложению возможность завершить себя чисто.*

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

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

* обратите внимание, что это верно только при использовании Вкладка "приложения" Диспетчера задач, чтобы убить приложение. Если вы используете вкладку "Процессы", этот шаг пропускается, и TerminateProcess функция вызывается немедленно. Это различие отражено в заголовке на соответствующих кнопках. На вкладке "Приложения", кнопка lableled "Снять задачу"; на вкладке "Процессы", кнопка с надписью "завершить процесс".


убийство процесса с WM_CLOSE просто сигнализирует процесс с сообщением и позволяет цели обрабатывать сообщение и выйти изящно. Кроме того, процесс может выбрать не выходить в своем WM_CLOSE обработчик.

убийство процесса через Диспетчер задач сделает это с TerminateProcess, который намного жестче:

на TerminateProcess функция используется для безусловной причины a процесс выхода. Состояние глобальных данных поддерживается dynamic-link библиотеки (DLL) могут быть скомпрометированы, если TerminateProcess используется вместо чем ExitProcess.

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

TerminateProcess асинхронный; он инициирует прекращение и немедленно возвращается. Если тебе нужно ... убедитесь, что процесс завершен, вызовите WaitForSingleObject


Если вы закрываете приложение с помощью кнопки Закрыть, вы позволяете приложению выполнять необходимые задачи закрытия, если таковые имеются. Если вы убиваете процесс из Диспетчера задач, у приложения нет шансов выполнить эти задачи, вы просто завершаете приложение без уведомления.