Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
25
Добавлен:
17.04.2013
Размер:
99.33 Кб
Скачать

Именованные объекты

Второй способ, позволяющий нескольким процессам совместно использовать одни и те же объекты ядра, опирается на имена объектов. Например, следующие функции создают именованные объекты ядра:CreateMutex, CreateEvent, CreateSemaphore, CreateFileMapping. У всех этих функций в последнем параметре(lpszName) задается имя объекта. Передавая в нем NULL,Вы создаете безымянный объект ядра.

Объекты без имени могут разделятся между процессами либо через механизм наследования,либо за счет дублирования описателей.Microsoftне дает рекомендаций о правилах именования объектов ядра. Например, создавая объект с именем JeffObj,Вы не застрахованы о того, что в системе уже есть объект ядра с таким именем. Более того, объекты разных типов (мьютексы, события, семафоры, проекции файлов, таймеры) —делят единое пространство имен.

Для доступа к именованному объекту, созданному в другом процессе можно использовать функциюCreateXxx. При выполнении этого вызова система сначала проверяет, существование объекта ядра с таким именем. Обнаружив, что такой объект существует, ядро проверяет его тип. Поскольку мы пытаемся создать объект с именем, которое уже существует,система считает вызов успешным и создает в таблице описателей, принадлежащей процессу, новую запись, а затем инициализирует ее так, чтобы она указывала на существующий объект ядра. Если объекта с указанным именем нет в системе, то будет создан новый объект ядра.

Вместо вызоваCreate-функции, процесс может обратиться к одной из Ореn-функций, в которых последний параметр определяет имя объекта ядра. В этом случае новый объект никогда не создается.

Handle OpenSemaphore(dword dwDesiredAccess, bool bInheritHandle, lpstr lpszName);

В этом вызове имя обязательно. Функция просматривают единое пространство имен объектов ядра, пытаясь найти совпадение. Если объекта с указанным именем нет, функции во возвращают NULL, a GetLastError—код 2 (ERROR_FILE_NOT_FOUND).Если объект с заданным именем существует и имеет правильный тип, то проверяются права доступа к данному объекту (параметрdwDesiredAccess).Если доступ разрешен, таблица описателей в вызывающем процессе обновляется и счетчик числа пользователей объекта возрастает на единицу.

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

Третий механизм совместного использования объектов ядра несколькими процессами опирается на функцию DliplicateHandle.

BOOL DuplicateHandle(

HANDLE hSourceProcessHandle, HANDLE hSourceHandle,

HANDLE hTargetProcessHandle, HANDLE lpTargetHandle,

DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);

Функция берет запись (hSourceHandle) в таблице описателей одною процесса и создает ее копию в таблице другого (lpTargetHandle). Предпоследние два параметра позволяют задать маску доступа и флаги наследования, устанавливаемые для данною описателя объекта ядра в процессе-приемнике.

Параметр dwOptionsможет быть 0или комбинацией двух флагов: DUPLICATE_SAME_ACCESSи DUPLICATE_CLOSE_SOURCE. Первый флаг указывает, что новый описатель должен иметь маску доступа источника (параметр dwDesiredAccess игнорируется). Второй флаг приводит к закрытию описателя в процессе-источнике.Онпозволяет процессам обмениваться объектом ядра как эстафетной палочкой. При этом счетчик объекта не меняется.

Пример

Пусть процесс A имеет доступ к объекту мьютексу, к которому хочет обратитьсяпроцесс В

// приведенный ниже код исполняется процессом А

// создаем обьект-мьютекс доступный процессу A

HANDLE hObjProcessA = CreateMutex(NULL, FALSE, NULL);

// открываем описатель объекта ядра "процесс В"

HANDLE hProcessB = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessIdB);

HANDLE hObjProcessB; // неинициализированный описатель объекта для процесса В

// предоставляем процессу В доступ к объекту-мьютексу

DuplicateHandle(GetCurrentProcess(), hObjProcessA, hProcessB, &hObJProcessB, 0, FALSE,

DUPLICATE_SAME_ACCESS);

// используем какую-нибудь форму межпроцессной связи, чтобы. передать

// значение описателя hObjProcessB в процесс В

// связь с процессом В больше не нужна

CloseHandle(hProcessB);

// если процессу А не нужен объект-мьютекс. он должен закрыть его

CloseHandle(nObjProcessA):

Соседние файлы в папке вар1