- •Глава 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).
- •Анонимный канал
- •Создание анонимных каналов
- •Соединение клиентов с анонимным каналом
- •Обмен данными по анонимному каналу
- •Именованный канал
- •Функция создания именованного канала
- •Функция соединения сервера с клиентом
- •Отключение сервера от клиента
- •Функция ожидания операции именованного канала
- •Функция объединения функций именованного канала
- •Подключение клиента к серверу
Функция соединения сервера с клиентом
Позволяет серверу именованного канала ждать, пока клиентский процесс подключится к экземпляру именованного канала. Клиентский процесс подключается путем вызова функции CreateFile или CallNamedPipe.
BOOL ConnectNamedPipe(
HANDLE hNamedPipe,
LPOVERLAPPED lpOverlapped
);
Параметры и описание:
(1) hNamedPipe — дескриптор серверной части экземпляра именованного канала. Этот дескриптор возвращается функцией CreateNamedPipe.
(2) lpOverlapped — определяет указатель на перекрытую структуру.
— Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED, параметр lpOverlapped не должен быть недействителен. Он должен указывать на действительную структуру OVERLAPPED. Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED и lpOverlapped имеет значение NULL, функция может неправильно сообщить о завершении операции подключения.
— Если hNamedPipe был создан с FILE_FLAG_OVERLAPPED и lpOverlapped не равен NULL, структура OVERLAPPED должна содержать дескриптор объекта события с ручным сбросом (который сервер может создать с помощью функции CreateEvent).
— Если hNamedPipe не был открыт с FILE_FLAG_OVERLAPPED, функция не вернется, пока клиент не подключится или не произойдет ошибка. Успешные синхронные операции приводят к тому, что функция возвращает ненулевое значение, если клиент подключается после вызова функции.
Возвращаемое значение.
Если операция является синхронной, ConnectNamedPipe не возвращается, пока операция не завершится. Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.
Если операция асинхронная, ConnectNamedPipe немедленно возвращается. Если операция еще не завершена, возвращаемое значение равно нулю, а GetLastError возвращает ERROR_IO_PENDING. (Вы можете использовать макрос HasOverlappedIoCompleted, чтобы определить, когда операция завершилась.) Если функция завершается ошибкой, возвращаемое значение равно нулю, а GetLastError возвращает значение, отличное от ERROR_IO_PENDING или ERROR_PIPE_CONNECTED.
Если клиент подключается до вызова функции, функция возвращает ноль, а GetLastError возвращает ERROR_PIPE_CONNECTED. Это может произойти, если клиент подключается в интервале между вызовом CreateNamedPipe и вызовом ConnectNamedPipe. В этой ситуации между клиентом и сервером существует хорошая связь, хотя функция возвращает ноль.
Отключение сервера от клиента
Отключает серверную часть экземпляра именованного канала от клиентского процесса.
BOOL DisconnectNamedPipe(
HANDLE hNamedPipe
);
Параметры и описание:
(1) hNamedPipe — дескриптор серверной части экземпляра именованного канала.
Возвращаемое значение.
Если функция завершается успешно, возвращаемое значение равно TRUE, иначе FALSE.
Функция ожидания операции именованного канала
Ожидание, пока не истечет интервал времени ожидания или не станет доступен экземпляр указанного именованного канала для подключения (то есть процесс сервера канала выполняет ожидающую операцию ConnectNamedPipe для канала).
BOOL WaitNamedPipe(
LPCSTR lpNamedPipeName,
DWORD nTimeOut,
);
Параметры и описание:
(1) lpNamedPipeName — определяет название именованного канала.
(2) lpInBuffer — определяет количество миллисекунд, в течение которых функция будет ожидать появления экземпляра именованного канала. Вы можете использовать одно из следующих значений вместо указания количества миллисекунд.
— NMPWAIT_USE_DEFAULT_WAIT (0x00000000) — это значение по умолчанию, указанное процессом сервера в функции CreateNamedPipe.
— NMPWAIT_WAIT_FOREVER (0xffffffff) — функция не возвращается, пока не будет доступен экземпляр именованного канала.
Возвращаемое значение.
Если экземпляр канала доступен до истечения времени ожидания, возвращаемое значение равно TRUE.
Если экземпляр канала недоступен до истечения времени ожидания, возвращаемое значение равно нулю.
Если экземпляров указанного именованного канала не существует, функция WaitNamedPipe немедленно возвращается, независимо от значения времени ожидания.
Если время ожидания истекло, функция WaitNamedPipe завершится с ошибкой ERROR_SEM_TIMEOUT.