Операционные системы. Программирование в операционной среде Windows
70 // Порождение процесса В Istrcpy(SzPath, TEXT ("ProcessB") ); CreateProcessA(NULL, szPath, &saProcess, &saThread, FALSE, 0, NULL, NULL, &si, &piProcessB); // Структура piProcessB содержит два дескриптора // относящихся к процессу А: hProcess, // который идентифицирует наследуемый объект процесса В / / и hThread, который идентифицирует ОЯ - главный поток // процесса В и не является наследуемым // Подготовка к порождению процесса С из процесса А // Параметры psaProcess и psaThread передаются как NULL , // дескрипторы к объектам процесс и // главный поток процесса С - по умолчанию ненаследуемые // Если процесс А породит другой процесс, этот процесс // не наследует дескрипторы к объектам процесса и потока // процесса С / / В качестве параметра bInheritHandles передается TRUE , // Процесс С будет наследовать дескриптор идентифицирующий // процесс В, но не будет наследовать дескриптор // его главного потока Istrcpy (szPath, TEXT ("ProcessC") ) ; CreateProcessA(NULL, szPath, NULL, NULL, TRUE, 0, NULL, NULL, &si, &piProcessC); Создавая процесс В, система формирует ОЯ «процесс» и «поток», а затем в структуре, на которую указывает параметр ppiProcInfo, возвращает их описатели процессу А, и с этого момента процесс А может манипулировать только что созданными объектами «процесс» и «поток». Предположим, что процесс А собирается вторично вызвать функцию CreateProcess, чтобы породить процесс С. Сначала ему нужно определить, стоит ли предоставлять процессу С доступ к своим ОЯ. Для этого используется параметр bInheritHandles, если он приравнен TRUE, система передаст процессу С все наследуемые описатели, в этом случае наследуется и описатель объекта ядра "процесс" процесса В. А вот описатель объекта "первичный поток" процесса В не наследуется ни при каком значении bInberitHandles. Кроме того, если процесс А вызывает CreateProcess, передавая через параметр bInheritHandles значение FALSE, процесс С не наследует никаких описателей, используемых в данный момент процессом А. 5. Параметр fdwCreate Параметр fdwCreate определяет флаги, влияющие на то, как именно создается новый процесс. Флаги комбинируются булевым оператором OR. Рассмотрим некоторые флаги: • Флаг DEBUG PROCESS даст возможность родительскому процессу проводить отладку дочернего, а также всех процессов, которые последним могут быть порождены. Если этот флаг установлен, система уведомляет родительский процесс о возникновении определенных
Made with FlippingBook
RkJQdWJsaXNoZXIy MTY0OTYy