Дублирование дескрипторов
Дублирование дескрипторов
Родительскому и дочернему процессам может требоваться различный доступ к объекту, идентифицируемому дескриптором, который наследует дочерний процесс. Кроме того, процессу вместо псевдодескриптора, получаемого с помощью функции GetModuleFileName или GetModuleFileNameEx, может потребоваться реальный, наследуемый дескриптор, который мог бы использоваться дочерним процессом. Родительский процесс может обеспечить это, создав копию дескриптора с желаемыми разрешениями доступа и свойствами наследования. Функция, позволяющая создавать копии дескрипторов, имеет следующий вид:
BOOL DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lphTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions)
По завершении выполнения функции указатель lphTargetHandle будет указывать на копию исходного дескриптора, hSourceHandle. hSourceHandle является дескриптором дублируемого объекта в процессе, указанном дескриптором hSourceProcessHandle, и должен иметь права доступа PROCESS_DUP_HANDLE; если указанного дескриптора в исходном процессе не существует, функция DuplicateHandle завершается ошибкой. Новый дескриптор, на который указывает указатель lphTargetHandle, является действительным в целевом процессе, hTargetProcessHandle. Обратите внимание на то, что в нашем рассмотрении фигурировали три процесса, включая вызывающий. Часто в роли вызывающего процесса выступает целевой или исходный процесс, и тогда соответствующий дескриптор получают с помощью функции GetCurrentProcess. Заметьте также, что процесс может создать дескриптор в другом процессе; если вы это делаете, то вам потребуется механизм, с помощью которого можно было бы передать в другой процесс идентификационные данные нового дескриптора.
Функция DuplicateHandle может применяться к дескрипторам любого типа.
Если действие параметра dwDesiredAccess не отменяется флагом DUPLICATE_SAME_ACCESS параметра dwOptions, то у него может быть много возможных значений (для получения более подробных сведений обратитесь к библиотеке MSDN оперативного справочного руководства).
Параметр dwOptions может содержать любую комбинацию указанных ниже двух флагов.
• DUPLICATE_CLOSE_SOURCE — вызывает закрытие исходного дескриптора.
• DUPLICATE_SAME_ACCESS — вынуждает игнорировать параметр dwDesiredAccess.
Напоминание
Ядро Windows поддерживает счетчики ссылок для всех объектов; этот счетчик представляет количество различных дескрипторов, ссылающихся на данный объект. В то же время, приложения не имеют доступа к этому счетчику. Любой объект не может быть уничтожен до тех пор, пока не будет закрыт его последний дескриптор, а счетчик ссылок не примет нулевое значение. Унаследованные и продублированные дескрипторы считаются отличными от исходных и также учитываются в счетчике ссылок. Наследуемые дескрипторы используются в программе 6.1 далее в этой главе. В то же время, дескрипторы, переданные из одного процесса в другой посредством той или иной формы механизма IPC, не считаются независимыми, и поэтому если один процесс закрывает такой дескриптор, то другие процессы использовать его не могут. Подобной методикой пользуются редко, однако в упражнении 6.2 вам предлагается передать значение унаследованного дескриптора из одного процесса в другой, используя механизм IPC.
Далее вы узнаете о том, как определить, завершено ли выполнение процесса.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
9.1.1.2. Разделение дескрипторов файлов
9.1.1.2. Разделение дескрипторов файлов Атрибуты, которые порожденный процесс наследует от родителя, устанавливаются в те же значения, которые были в родительском процессе в момент выполнения fork(). Однако, с этого момента два процесса продолжают идти собственными путями
Счетчики дескрипторов процессов
Счетчики дескрипторов процессов Распространенной ошибкой программистов является пренебрежение закрытием дескрипторов после того, как необходимость в них отпала; это может стать причиной утечки ресурсов, что, в свою очередь, может приводить к снижению
11.5.3. Дублирование файловых дескрипторов
11.5.3. Дублирование файловых дескрипторов Иногда процессам требуется создать новый файловый дескриптор, который ссылается на ранее открытый файл. Командные оболочки используют эту функциональность для перенаправления стандартного ввода, вывода и потока ошибок по
22.3.7. Закрытие файловых дескрипторов
22.3.7. Закрытие файловых дескрипторов В системах Linux и Unix файловые дескрипторы, как правило, наследуются через системные вызовы exec() (и всегда наследуются через fork() и vfork()). В большинстве случаев такое поведение нежелательно, поскольку только разделяться должны только stdin,
15.7. Передача дескрипторов
15.7. Передача дескрипторов Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции fork.2. Все дескрипторы
10.5. Дублирование данных: введение в RAID
10.5. Дублирование данных: введение в RAID Идея надежности хранения данных волновала, волнует и будет волновать не одно поколение системных администраторов и пользователей. Используемые ОС Linux файловые системы ext2 и ext3 обладают достаточной степенью надежности, но зачастую
Дублирование, аффилиаты, ошибки
Дублирование, аффилиаты, ошибки Анализ содержания поддоменов. На поддоменах может располагаться что угодно: копия сайта, спамный контент, вирусы. Например, на поддомене может располагаться архивная версия форума, которая уже не работает и поэтому не обновляется.
Копирование и дублирование объектов
Копирование и дублирование объектов При работе часто требуется создать копию объекта – для сравнения, для подстраховки (запасную копию) или же если просто нужно несколько одинаковых объектов. В Adobe InDesign существуют разные способы дублировния объектов.Прежде всего, даже
15.8. Передача дескрипторов
15.8. Передача дескрипторов Когда мы говорим о передаче открытого дескриптора от одного процесса другому, обычно подразумевается одно из двух:? наследование всех открытых дескрипторов родительского процесса дочерним после вызова fork;? сохранение открытых дескрипторов при
Дублирование и объединение слоев
Дублирование и объединение слоев Дублирование слоев – это самостоятельная операция, позволяющая получить полноценную копию указанного слоя. Любой слой может быть продублирован. То есть мы можем создать слой, являющийся точной копией какого-либо из уже существующих.Для
Глава 22 Дублирование данных
Глава 22 Дублирование данных Современные носители информации обладают высокой надежностью, однако нельзя быть полностью застрахованным от возможных сбоев оборудования. Проблемы с программами, даже операционными системами можно решить путем их переустановки, но если