- •Глава 2. Синхронизация задач с использованием api-функций и механизмов ядра.
- •§0. Объекты ядра. Основы.
- •Учет пользователей объектов ядра
- •Процесс и поток: краткая характеристика
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Наследование описателей объекта
- •Именованные объекты
- •3. После этого вызова система проверяет, существует ли уже объект ядра с таким же именем. Если существует, то
- •Open-функции
- •Дублирование описателей объектов
- •1) Процесс-катализатор.
- •2) Процесс-источник.
- •3) Процесс-приемник.
- •Исходное состояние
- •1 0XF0000000 (неприм.) (неприм.)
- •1 0XF0000000 (неприм.) (неприм.)
- •Состояние после вызова DuplicateHandle
- •§1. Синхронизация задач с использованием функций ожидания.
- •Функция ожидания одного объекта
- •Функция ожидания нескольких объектов
- •Функция ожидания нескольких объектов и сообщений
- •Функция создания дочернего процесса
- •Функция завершения дочернего процесса из самого дочернего процесса
- •Функция завершения дочернего процесса из процесса родителя
- •Функция создания вторичного потока
- •Функция завершения дочернего потока из самого дочернего потока (only c)
- •Функция завершения дочернего потока из потока родителя
- •If (my_file.Is_open()) { /// Если удалось открыть
- •Функция создания вторичного потока _beginthread
- •Функция создания вторичного потока _beginthreadex
- •§2. Синхронизация задач с помощью объектов ядра «событие» (Event).
- •Функция создания события
- •Функция установки сигнального состояния события
- •Функция установки несигнального состояния события
- •Функция открытия существующего именованного объекта события
- •Дескриптор защиты (структура)
- •§3. Синхронизация задач с помощью объектов ядра «семафор» (Semaphore).
- •Функция создания семафора
- •Функция открытия семафора
- •Функция увеличения счетчика семафора на указанное количество
- •If (!ReleaseSemaphore( ghSemaphore, 1, null)) /// Если ошибка
- •§4. Синхронизация задач с помощью объектов ядра «мьютекс» (Mutex).
- •Функция создания мьютекса
- •Функция открытия существующего именованного объекта мьютекса
- •Функция освобождения владельца указанного объекта мьютекса
- •§5. Синхронизация задач с помощью объектов ядра «уведомление об изменении» (Change Notification).
- •Функция создания объекта ядра «уведомление об изменении»
- •Функция перезапуска объекта ядра «уведомление об изменении»
- •Функция остановки мониторинга дескриптора объекта ядра «уведомление об изменении»
- •§6. Синхронизация задач с помощью объектов ядра «таймер ожидания» (Waitable Timer).
- •Функция создания объекта ядра «таймер ожидания»
- •Функция активации объекта ядра «ожидаемый таймер»
- •Функция открытия объекта ядра «ожидаемый таймер»
- •1. Функцией CancelWaitableTimer().
- •2. Функцией SetWaitableTimer().
- •If (bSuccess) /// Если успешно, то
- •If (bSuccess) /// Если успешно, то
- •§7. Синхронизация задач с помощью объектов ядра «канал» (Pipe).
- •Анонимный канал
- •Создание анонимных каналов
- •Соединение клиентов с анонимным каналом
- •Обмен данными по анонимному каналу
- •Именованный канал
- •Функция создания именованного канала
- •Функция соединения сервера с клиентом
- •Отключение сервера от клиента
- •Функция ожидания операции именованного канала
- •Функция объединения функций именованного канала
- •Подключение клиента к серверу
Дублирование описателей объектов
BOOL DuplicateHandle(
IN HANDLE hSourceProcessHandle,
IN HANDLE hSourceHandle,
IN HANDLE hTargetProcessHandle,
IN LPHANDLE lpTargetHandle,
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN DWORD dwOptions
);
Параметры и описание:
(1) hSourceProcessHandle определяет дескриптор процесса с дескриптором, подлежащим дублированию. Дескриптор должен иметь право доступа PROCESS_DUP_HANDLE.
(2) hSourceHandle определяет дескриптор объекта для дублирования.
(3) hTargetProcessHandle определяет дескриптор процесса, который должен получить дублированный дескриптор. Дескриптор должен иметь право доступа PROCESS_DUP_HANDLE.
(4) lpTargetHandle определяет указатель на переменную, которая получает дубликат дескриптора.
(5) dwDesiredAccess определяет доступ, запрошенный для нового дескриптора. Этот параметр игнорируется, если параметр dwOptions указывает флаг DUPLICATE_SAME_ACCESS. В противном случае флаги, которые можно указать, зависят от типа объекта, дескриптор которого должен быть продублирован.
(6) bInheritHandle определяет переменную, которая указывает, является ли дескриптор наследуемым. Если TRUE, дубликат дескриптора может наследоваться новыми процессами, созданными целевым процессом. Если FALSE, новый дескриптор не может быть унаследован.
(7) dwOptions определяет опции. Этот параметр может быть нулем или любой комбинацией следующих значений:
— DUPLICATE_CLOSE_SOURCE (0x00000001)
Закрывает дескриптор в процессе-источнике. Такое задание параметра позволяет процессам обмениваться объектом ядра как эстафетной палочкой. При этом счетчик объекта не меняется.
— DUPLICATE_SAME_ACCESS (0x00000002)
У описателя, получаемого процессом-приемником, должна быть та же маска доступа, что и у описателя в процессе-источнике. Этот флаг заставляет игнорировать параметр dwDesiredAccess.
Возвращаемое значение.
Если функция завершается успешно, возвращаемое значение отлично от нуля (bool: true), иначе возвращаемое значение равно нулю (bool: false).
Описание.
Эта функция берет запись в таблице описателей одного процесса и создает ее копию в таблице другого. Обычно ее применение требует наличия в системе трех разных процессов:
1) Процесс-катализатор.
2) Процесс-источник.
3) Процесс-приемник.
Иллюстрация работы функции DuplicateHandle.
Исходное состояние
Процесс-катализатор, вызывающий функцию DuplicateHandle содержит следующую таблицу описателей.
Индекс Указатель Маска Флаги
1 0xF0000000 0x???????? 0x00000000
2 0xF0000010 0x???????? 0x00000000
Первый индекс — объект ядра процесса-источника, имеющего доступ к какому-то объекту ядра.
Второй индекс — объект ядра процесса-приемника, который получит доступ к тому же объекту ядра.
Процесс-источник, имеющий доступ к какому-то объекту ядра, содержит следующую таблицу описателей.
Индекс Указатель Маска Флаги
1 0XF0000000 (неприм.) (неприм.)
2 0xF0000020 0x???????? 0x00000000
Как видно, процесс-источник содержит только одну запись со значением индекса, равным 2.
неприм. — неприменим
0xF0000020 идентифицирует объект ядра любого типа.
Процесс-приемник, который получит доступ к тому же объекту ядра, содержит следующую таблицу описателей.
Индекс Указатель Маска Флаги