Операционные системы. Программирование в операционной среде Windows
77 родительского процесса, но хорошо написанная программа должна сама закрывать описатели дочернего процесса и его первичного потока, как только необходимость в них отпадает. Закрывая описатель, просто сообщается системе, что статистические данные для этого процесса или потока больше не интересуют, но процесс или поток продолжает исполняться системой до тех пор, пока он сам не завершит себя. Созданному ОЯ «процесс» присваивается уникальный идентификатор, ни у каких других объектов этого типа в системе не может быть одинаковых идентификаторов. Это же касается и ОЯ «поток». Причем идентификаторы процессаи потока тоже разные, и их значения никогда не бывают нулевыми. Завершая свою работу, CreateProcess заносит значения идентификаторов в элементы dwProcessId и dwThreadId структуры PROCESS INFORMATION. Эти идентификаторы облегчают определение процессов и потоков в системе. Система способна повторно использовать идентификаторы процессови потоков. Например, при создании процесса система формирует объект «процесс», присваивая ему идентификатор со значением, допустим, 150. Создавая новый объект «процесс», система уже не присвоит ему данный идентификатор. Но после выгрузки из памяти первого объекта следуюш,ему создаваемому объекту «процесс» может быть присвоен тот же идентификатор — 150. Если при написании программы не учитывать эту особенность системы, можно получить серьезную ошибку. Допустим в программе сохранили идентификатор процесса, но в следуюш,ий момент этот процесс завершился, а новый процесс получил тот же идентификатор. В итоге сохраненный ранее идентификатор уже связан совсем с другим процессом и обраш,ение к нему приведет к ошибке. Иногда программе приходится определять свой родительский процесс. Однако родственные связи между процессами суш,ествуют лишь на стадии создания дочернего процесса. Непосредственно перед началом исполнения кода в дочернем процессе Windows перестает учитывать его родственные связи. Для определения родительского процесса рекомендуется использовать ОЯ, описатели окон и т. д. Единственный способ добиться того, чтобы идентификатор процесса или потока не использовался повторно, — не допускать разрушения ОЯ «процесс» или «поток». Если только что создан новый процесс или поток, то можно просто не закрывать описатели на эти объекты. А по окончании операций с идентификатором, вызвать функцию CloseHandle и освободить соответствуюш,ие ОЯ. Однако для дочернего процесса этот способ не годится, если только он не унаследовал описатели ОЯ от родительского процесса.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy