Операционные системы. Программирование в операционной среде Windows
13 Параметр ppiProcInfo указывает на структуру PROCESS INFORMATION, которую необходимо предварительно создать. Ее элементы инициализируются самой функцией CreateProcess. В поля hProcess, hThread структуры PROCESSINFORMATIONзаносятся описатели ОЯ «процесс» и ОЯ «поток», в поля dwProcessId и dwThreadId - идентификаторы ОЯ «процесс» и ОЯ «поток». Подробное описание параметров функции CreateProcess приведено в приложении 1. 1.7. Завершение процесса Процесс желательно завершить возвратом из входной функции первичного потока. Только при возврате из входной функции в стартовую функцию возможно корректное освобождение ресурсов и стека первичного потока, установка кода завершения и уменьшение счетчика пользователей. Затем стартовая функция вызывает функцию ExitProcess - выход из процесса. При завершении процессапроисходит следующее: - завершаются все его потоки; - уничтожаются все User- и GDI-объекты, созданные процессом; - устанавливается код завершения процесса; - счетчик ОЯ «процесс» уменьшается на единицу; - уменьшаются счетчики ОЯ, связанных с процессом. Возможны, но нежелательны, другие способы: - один из потоков процесса может вызвать функцию ExitProcess (не позволяет корректно разрушить объекты и очистить ресурсы); - поток другого процесса вызывает функцию TerminateProcess (процесс об этом не знает и теряет данные); - все потоки процесса умирают по своей воле (все потоки вызвали ExitThread или их закрыли вызовом TerminateTbread). Связанный с завершаемым процессом ОЯ не высвобождается, пока не будут закрыты ссылки на него из других процессов. В момент завершения процесса система автоматически уменьшает счетчик пользователей этого объекта на единицу, и объект разрушается, как только его счетчик обнуляется. Закрытие процесса не приводит к автоматическому завершению порожденных им процессов. По завершении процесса его код и выделенные ему ресурсы удаляются из памяти. Однако область памяти, выделенная системой для ОЯ «процесс», освободится только тогда, когда все прочие процессы, создавшие или открывшие описатели для завершившегося процесса, уведомят систему (вызовом CloseHandle) о том, что ссылки на этот процесс им больше не нужны, т.е. пока счетчик числа его пользователей не достигнет нуля. Родительский процесс, вызвав функцию GetExitCodeProcess, может проверить, завершен ли процесс, идентифицируемый параметром hProcess, и, если да, определить код завершения:
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy