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


Процесс выполняется до тех пор, пока не произойдет одно из нижеследующих событий:

Когда процесс завершает работу, все потоки процесса немедленно завершают работу без шанса запустить дополнительный код. Это означает то, что процесс не выполняет код в блоках обработчика завершения работы. Для получения дополнительной информации, см. статью Структурная обработка особых ситуаций.

Функция GetExitCodeProcess возвращает значение состояние завершения процесса. В то время пока процесс выполняется, его состояние завершения является STILL_ACTIVE. Когда процесс заканчивает работу, его состояние завершения изменяется из STILL_ACTIVE в код выхода процесса. Код выхода является или значением, определяемым при вызове ExitProcess или TerminateProcess, или значением, возвращаемым функцией main или функцией WinMain процесса. Если процесс завершил работу в результате фатальной исключительной ситуации, код выхода является значением исключения, которое вызвало завершение. Кроме того, это значение используется как код выхода для всех потоков, которые выполнялись, когда произошла исключительная ситуация.

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

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

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

Выполнение функций ExitProcess, ExitThread, CreateThread, CreateRemoteThread и CreateProcess переводится в последовательный режим в пределах адресного пространства. Применяются нижеследующие ограничения:

Внимание! Функция TerminateProcess должна использоваться только в экстремальных обстоятельствах, так как она не дает возможности потокам очищать или сохранять данные и не уведомляет связанные с процессом DLL. Если Вам нужно иметь один процесс, который завершает другой процесс, то нижеследующие шаги обеспечивают лучшее решение этой проблемы:

  • Необходимо, чтобы оба процесса вызвали функцию RegisterWindowMessage для создания нестандартного сообщения.
  • Один процесс может завершить работу другого процесса, при помощи транслирования нестандартного сообщения, используя функцию BroadcastSystemMessage, как ниже указано:

 

BroadcastSystemMessage(
BSF_IGNORECURRENTTASK, // не отправлять сообщение этому процессу
BSM_APPLICATIONS,      // транслировать только приложению
private message,       // сообщение, зарегистрированное в предыдущем шаге
wParam,                // значение, установленное сообщением
lParam );              // значение, установленное сообщением

Обратите внимание!, когда система завершает работу процесса, она не прерывает, какой-либо дочерний процесс, который этот процесс создал.

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz