При завершении процесс происходит следующее:
- Выполнение всех потоков в процессе прекращается
- Все User- и GDI-объекты, созданные процессом, уничтожаются, а объекты ядра закрываются (если их не использует другой процесс).
- Код завершения процесса меняется со значения STILL_ACTIVE на код, переданный в ExitProcess или TerminateProcess.
- Объект ядра «процесс» переходит в свободное, или незанятое (signaled), состояние Прочие потоки в системе могут при остановить свое выполнение вплоть до завершения данного процесса.
- Счетчик объекта ядра «процесс» уменьшается на единицу.
Связанный с завершаемым процессом объект ядра не высвобождается, пока не будут закрыты ссылки на него и из других процессов. В момент завершения процесса система автоматически уменьшает счетчик пользователей этого объекта на единицу, и объект разрушается, как только его счетчик обнуляется. Кроме того, закрытие процесса не приводит к автоматическому завершению порожденных им процессов
По завершении процесса его код и выделенные ему ресурсы удаляются из памяти. Однако область памяти, выделенная системой для объекта ядра «процесс», не освобождается, пока счетчик числа его пользователей не достигнет нуля. А это произойдет, когда все прочие процессы, создавшие или открывшие описатели для ныне покойного процесса, уведомят систему (вызовом CloseHandle) о том, что ссылки па этот процесс им больше не нужны.
|
|
Описатели завершенного процессса уже мало на что пригодны. Разве что родительский процесс, вызвав функцию GetExitCodeProcess, может проверигь, завершен ли процесс, идентифицируемый параметром hProcess, и, если да, определить код завершения:
BOOL GetExitCodeProcess(HANDLE hProcess, PDWORD pdwExitCode);
Код завершения возвращается как значение типа DWORD, на которое указывает pdwExitCode. Если на момент вызова GetExitCodeProcess процесс еще не завершился, в DWORD заносится идентификатор STILL_ACTIVE (определенный как 0x103) А если он уничтожен, функция возвращает реальный код его завершения.
В принципе можно написать код, который, периодически вызывая функцию GetExitCodeProcess и проверяя возвращаемое ею значение, определял бы момент завершения процесса. В принципе такой код мог бы сработать во многих ситуациях, но он был бы неэффективен.