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


Наследство

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

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

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

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

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

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

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

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

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

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

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

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

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