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

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

  • Определить, что дескриптор должен быть унаследован, когда Вы создаете, открываете или дублируйте дескриптор. Функции создания обычно используют для этой цели член bInheritHandle структуры SECURITY_ATTRIBUTES. Функция DuplicateHandle использует параметр bInheritHandle.
  • Определить, что наследуемые дескрипторы должны быть унаследованы тогда, когда Вы вызываете функцию CreateProcess с параметром bInheritHandles установленным в значение ИСТИНА (TRUE). Дополнительно, чтобы наследовать стандартный ввод, стандартный вывод данных и обработку стандартной ошибки, член dwFlags структуры STARTUPINFO должен включить в себя флажок STARTF_USERSTDHANDLES.

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

Функция DuplicateHandle является полезной тогда, если процесс имеет наследуемый открытый дескриптор, а Вы не желаете, чтобы он был унаследован дочерним процессом. В этом случае используйте функцию DuplicateHandle, чтобы открыть дубликат дескриптора, который не может быть унаследован, а затем используйте функцию CloseHandle, чтобы закрыть наследуемый дескриптор. Вы можете также использовать функцию DuplicateHandle, чтобы открыть наследуемый дубликат дескриптора, который не может быть унаследован.

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: