Совместное использование объектов ядра несколькими процессами. Наследование описателя объекта.

Иногда возникает необходимость в разделении объектов ядра между потоками, исполняемыми в разных процессах, например:

-объекты “проекции файлов”, которые позволяют двум процессам, исполняемым на одной машине, совместно использовать одни и те же блоки данных;

-почтовые ящики (mail slots) и именованные каналы (named pipes), которые дают возможность программам обмениваться данными с процессами, исполняемыми на других машинах в сети;

-мьютексы (mutexes), семафоры (semaphores) и события (events), которые позволяют синхронизировать потоки, исполняемые в разных процессах, чтобы одно приложение могло уведомить другое об окончании той или иной операции.

Однако поскольку описатели объектов ядра имеют смысл только в конкретном процессе, разделение объектов ядра между несколькими процессами в Win32 весьма трудоёмкая задача. Главная причина сделать описатели “процессо-зависимыми” – устойчивость операционной системы к сбоям. Если бы описатели объектов ядра были общесистемными, то один процесс мог бы получить описатель объекта, используемого другим процессом, и устроить в этом процессе настоящий хаос. Другая причина – защита. Объекты ядра защищены, и процесс, прежде чем оперировать с ними, должен запрашивать разрешение на доступ к ним. Процесс – создатель объекта может предотвратить несанкционированный доступ к этому объекту со стороны другого процесса.

Могут использоваться следующие механизмы, позволяющие процессам совместно использовать одни и те же объекты ядра:

-наследование описателя объекта;

-именованные объекты;

-дублирование описателей объектов.

Наследование применимо, только когда процессы связаны “родственными” отношениями (родительский – дочерний). Например, родительскому процессу доступны один или несколько описателей объектов ядра, и он решает, породив дочерний процесс, передать ему по наследству доступ к своим объектам ядра. Чтобы такой сценарий наследования сработал, родительский процесс должен выполнить несколько операций.

Во-первых, еще при создании объекта ядра сообщить системе, что ему нужен наследуемый описатель этого объекта. Cледует иметь в виду, что описатели объектов ядра наследуются, но сами объектыядра – нет.

Следующий этап – родительский процесс порождает дочерний.

Объект типа процесс (process) может быть использован для того, чтобы приостановить выполнение потока в том случае, если он для своего продолжения нуждается в завершении процесса. С практической точки зрения проблема порождения дочернего процесса встает, когда нужно в рамках вашего приложения исполнить приложение, созданное кем-то другим, или, к примеру, запустить сеанс MS-DOS.