Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разорёнов 2008 full(Краткий конспект).doc
Скачиваний:
11
Добавлен:
21.04.2019
Размер:
1.33 Mб
Скачать

55 Наследование дочерними процессами ресурсов родителя

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

  • Открытые дескрипторы, возвращенные функцией CreateFile. Это включает в себя дескрипторы к файлам, буферам консольного ввода, консольным экранным буферам, именованным каналам, последовательным устройствам связи и почтовым ящикам в ядре системы.

  • Открытые дескрипторы процесса, потока, мьютекса, события, семафора, именованного канала, анонимного канала и отображаемых в памяти объектов. Они возвращаются функциями CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe и CreateFileMapping, соответственно.

  • Переменные окружения.

  • Текущий каталог.

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

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

  • Класс приоритета.

  • Дескрипторы, возвращенные функциями LocalAlloc, GlobalAlloc, HeapCreate, и HeapAlloc.

  • Псевдодескрипторы такие же, как дескрипторы, возвращенные функцией GetCurrentProcess или GetCurrentThread. Эти дескрипторы допустимы только для вызывающего процесса.

  • Дескрипторы модуля динамически подключаемой библиотеки (DLL), возвращенные функцией LoadLibrary.

  • Дескрипторы GDI или USER, типа HBITMAP или HMENU.

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

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

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

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

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

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

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

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

Наследование переменных окружения

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