Совместное использование объектов ядра несколькими процессами. Наследование описателя объекта.
Иногда возникает необходимость в разделении объектов ядра между потоками, исполняемыми в разных процессах, например:
-объекты “проекции файлов”, которые позволяют двум процессам, исполняемым на одной машине, совместно использовать одни и те же блоки данных;
-почтовые ящики (mail slots) и именованные каналы (named pipes), которые дают возможность программам обмениваться данными с процессами, исполняемыми на других машинах в сети;
-мьютексы (mutexes), семафоры (semaphores) и события (events), которые позволяют синхронизировать потоки, исполняемые в разных процессах, чтобы одно приложение могло уведомить другое об окончании той или иной операции.
Однако поскольку описатели объектов ядра имеют смысл только в конкретном процессе, разделение объектов ядра между несколькими процессами в Win32 весьма трудоёмкая задача. Главная причина сделать описатели “процессо-зависимыми” – устойчивость операционной системы к сбоям. Если бы описатели объектов ядра были общесистемными, то один процесс мог бы получить описатель объекта, используемого другим процессом, и устроить в этом процессе настоящий хаос. Другая причина – защита. Объекты ядра защищены, и процесс, прежде чем оперировать с ними, должен запрашивать разрешение на доступ к ним. Процесс – создатель объекта может предотвратить несанкционированный доступ к этому объекту со стороны другого процесса.
Могут использоваться следующие механизмы, позволяющие процессам совместно использовать одни и те же объекты ядра:
-наследование описателя объекта;
-именованные объекты;
-дублирование описателей объектов.
Наследование применимо, только когда процессы связаны “родственными” отношениями (родительский – дочерний). Например, родительскому процессу доступны один или несколько описателей объектов ядра, и он решает, породив дочерний процесс, передать ему по наследству доступ к своим объектам ядра. Чтобы такой сценарий наследования сработал, родительский процесс должен выполнить несколько операций.
Во-первых, еще при создании объекта ядра сообщить системе, что ему нужен наследуемый описатель этого объекта. Cледует иметь в виду, что описатели объектов ядра наследуются, но сами объектыядра – нет.
Следующий этап – родительский процесс порождает дочерний.
Объект типа процесс (process) может быть использован для того, чтобы приостановить выполнение потока в том случае, если он для своего продолжения нуждается в завершении процесса. С практической точки зрения проблема порождения дочернего процесса встает, когда нужно в рамках вашего приложения исполнить приложение, созданное кем-то другим, или, к примеру, запустить сеанс MS-DOS.