Поделиться через


Наследование

Дочерний процесс может наследовать несколько свойств и ресурсов от родительского процесса. Можно также запретить дочернему процессу наследовать свойства от родительского процесса. Следующие компоненты могут быть унаследованы:

  • Открытые дескрипторы, возвращаемые функцией CreateFile . Сюда входят дескрипторы файлов, входные буферы консоли, буферы экрана консоли, именованные каналы, последовательные устройства связи и почтовые диаграммы.
  • Открытие дескрипторов для объектов обработки, потока, мьютекса, события, семафора, именованного канала, анонимного канала и сопоставления файлов. Они возвращаются функциями CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe и CreateFileMapping соответственно.
  • Переменные среды.
  • Текущий каталог.
  • Консоль, если процесс не отсоединен или не создана новая консоль. Процесс дочерней консоли также может наследовать стандартные дескрипторы родительского элемента, а также доступ к входным буферам и буферу активного экрана.
  • Режим ошибки, заданный функцией SetErrorMode .
  • Маска сходства процессора.
  • Связь с заданием.

Дочерний процесс не наследует следующее:

  • Класс Priority.
  • Дескрипторы, возвращаемые LocalAlloc, GlobalAlloc, HeapCreate и HeapAlloc.
  • Псевдо дескрипторов, как в дескрипторов, возвращаемых функцией GetCurrentProcess или GetCurrentThread . Эти дескрипторы допустимы только для вызывающего процесса.
  • Дескриптора модуля DLL, возвращаемые функцией LoadLibrary .
  • Дескрипторы GDI или USER, такие как HBITMAP или HMENU.

Наследование дескрипторов

Дочерний процесс может наследовать некоторые из его родительских дескрипторов, но не наследовать другие. Чтобы вызвать наследование дескриптора, необходимо выполнить два действия:

  • Укажите, что дескриптор должен наследоваться при создании, открытии или дублировании дескриптора. Функции создания обычно используют для этой цели элемент bInheritHandleструктуры SECURITY_ATTRIBUTES . DuplicateHandle использует параметр bInheritHandles .
  • Укажите, что наследуемые дескрипторы должны наследоваться, задав для параметра bInheritHandles значение TRUE при вызове функции CreateProcess . Кроме того, чтобы наследовать стандартные входные данные, стандартные выходные данные и стандартные дескрипторы ошибок, член dwFlags структуры STARTUPINFO должен включать STARTF_USESTDHANDLES.

Чтобы указать список дескрипторов, которые должны наследоваться определенным дочерним процессом, вызовите функцию UpdateProcThreadAttribute с флагом PROC_THREAD_ATTRIBUTE_HANDLE_LIST .

Унаследованный дескриптор ссылается на тот же объект в дочернем процессе, что и в родительском процессе. Он также имеет то же значение и привилегии доступа. Таким образом, когда один процесс изменяет состояние объекта, это изменение влияет на оба процесса. Чтобы использовать дескриптор, дочерний процесс должен получить значение дескриптора и "знать" объект, на который он ссылается. Как правило, родительский процесс передает эти сведения дочернему процессу через его командную строку, блок среды или какую-либо форму межпроцессного взаимодействия.

Используйте функцию SetHandleInformation для управления наследованием существующего дескриптора.

Наследование переменных среды

Дочерний процесс по умолчанию наследует переменные среды родительского процесса. Однако CreateProcess позволяет родительскому процессу указать другой блок переменных среды. Дополнительные сведения см. в разделе Переменные среды.

Наследование текущего каталога

Функция GetCurrentDirectory извлекает текущий каталог вызывающего процесса. Дочерний процесс по умолчанию наследует текущий каталог родительского процесса. Однако CreateProcess позволяет родительскому процессу указать другой текущий каталог для дочернего процесса. Чтобы изменить текущий каталог вызывающего процесса, используйте функцию SetCurrentDirectory .