Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


Ќаследуемые дескрипторы




„асто бывает так, что дочернему процессу требуетс€ доступ к объекту, к которому можно обратитьс€ через дескриптор, определенный в родительском процессе, и если этот дескриптор Ч наследуемый, то дочерний процесс может получить копию открытого дескриптора родительского процесса. „асто именно так обеспечиваетс€ возможность использовани€ дескрипторов стандартного ввода и вывода дочерним процессом. ѕреобразование дескриптора в наследуемый, чтобы дочерний процесс мог получить и использовать его копию, требует выполнени€ нескольких шагов.

‘лаг bInheritHandles, который можно указать при вызове функции CreateProcess, определ€ет, будет ли дочерний процесс наследовать копии наследуемых дескрипторов открытых файлов, процессов и так далее. Ётот флаг можно рассматривать как главный переключатель, действующий в отношении всех дескрипторов.

 роме того, чтобы сделать наследуемым любой отдельный дескриптор, также требуетс€ предпринимать специальные действи€, поскольку дескрипторы не станов€тс€ таковыми по умолчанию. —оздать наследуемый дескриптор можно либо путем использовани€ структуры SECURITY_ATTRIBUTES в момент создани€ дескриптора, либо путем копировани€ существующего дескриптора.

¬ структуре SECURITY_ATTRIBUTES присутствует флаг bInheritHandle, значение которого должно быть установлено равным TRUE. He забывайте также о том, что элемент nLength должен инициализироватьс€ следующим значением:

sizeof(SECURITY_ATTRIBUTES)

ѕриведенный ниже фрагмент кода иллюстрирует создание наследуемых файловых или иных дескрипторов в типичных случа€х. ¬ этом примере дескриптор защиты в структуре атрибутов защиты установлен в NULL; подробнее об использовании дескрипторов защиты говоритс€ в главе 15.

HANDLE h1, h2, h3;

SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };

Е

h1 = CreateFile(Е, &sa, Е); /* Ќаследуемый. */

h2 = CreateFile(Е, NULL, Е); /* Ќенаследуемый. */

h3 = CreateFile(Е, &sa, Е); /* Ќаследуемый. ¬озможно повторное использование структуры sa. */

ќднако дочернему процессу значение наследуемого дескриптора пока еще не известно, и поэтому родительский процесс должен передать это значение дочернему процессу либо через механизм межпроцессного взаимодействи€ (Interprocess Communication, IPC), либо путем назначени€ дескриптора стандартному устройству ввода/вывода в структуре STARTUPINFO, как это делаетс€ в первом из примеров, приведенных в данной главе (программа 6.1), а также в р€де примеров в остальной части книги. ќбычно последний метод €вл€етс€ более предпочтительным, так как он позвол€ет перенаправить ввод/вывод стандартным способом без внесени€ каких-либо изменений в дочернюю программу.

¬ случае дескрипторов, которые не €вл€ютс€ дескрипторами файлов или не используютс€ дл€ перенаправлени€ ввода/вывода, применим другой способ, в соответствии с которым дескриптор преобразуетс€ в текстовый формат и помещаетс€ в командную строку или переменную окружени€. “акой подход можно использовать лишь в том случае, если дескриптор €вл€етс€ наследуемым, поскольку и родительский, и дочерний процессы используют дл€ идентификации дескриптора одно и то же значение. ќдин из способов реализации этого подхода предлагаетс€ в упражнении 6.2, а соответствующее решение приводитс€ на Web-сайте книги.

”наследованные дескрипторы представл€ют собой отдельные экземпл€ры. ѕоэтому родительский и дочерний процессы могут получить доступ к одному и тому же файлу, использу€ различные указатели файлов. Ѕолее того, каждый из обоих процессов может и должен самосто€тельно закрывать принадлежащий ему дескриптор.

Ќа рис. 6.2 показан пример двух процессов с двум€ различными таблицами дескрипторов, в которых с одним и тем же файлом или иным объектом св€заны два различных дескриптора. ѕроцесс 1 €вл€етс€ родительским, процесс 2 Ч дочерним. ≈сли принадлежащий дочернему процессу дескриптор был унаследован им, как это имеет место в случае дескрипторов 1 и 3, то значени€ дескрипторов в обоих процессах будут одинаковыми.

ќднако подобные дескрипторы могут иметь и различные значени€. “ак, на файл D указывают два дескриптора, причем процесс 2 получил дескриптор за счет вызова функции CreateFile, а не путем наследовани€. Ќаконец, возможны ситуации, когда один из процессов имеет дескриптор объекта, а второй Ч не имеет, что наблюдаетс€ дл€ файлов ¬ и ≈. “ак происходит в тех случа€х, когда дескриптор создаетс€ дочерним процессом или дублируетс€ из одного процесса в другой, о чем говоритс€ в разделе "ƒублирование дескрипторов".

–ис. 6.2. “аблицы дескрипторов объектов дл€ двух процессов





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-09-20; ћы поможем в написании ваших работ!; просмотров: 581 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

“ак просто быть добрым - нужно только представить себ€ на месте другого человека прежде, чем начать его судить. © ћарлен ƒитрих
==> читать все изречени€...

2136 - | 1891 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.011 с.