- •Глава 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 TransactNamedPipe(
HANDLE hNamedPipe,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesRead,
LPOVERLAPPED lpOverlapped,
);
Параметры и описание:
(1) lpNamedPipeName — определяет дескриптор именованного канала, возвращаемый функцией CreateNamedPipe или CreateFile. Этот параметр также может быть дескриптором анонимного канала, возвращаемого функцией CreatePipe.
(2) lpInBuffer — определяет указатель на буфер, содержащий данные для записи в канал.
(3) nInBufferSize — определяет размер входного буфера, в байтах.
(4) lpOutBuffer — определяет указатель на буфер, который получает данные, прочитанные из канала.
(5) nOutBufferSize — определяет размер выходного буфера в байтах.
(6) lpBytesRead — определяет указатель на переменную, которая получает количество байтов, прочитанных из канала.
Если lpOverlapped имеет значение NULL, lpBytesRead не может быть NULL.
Если lpOverlapped не NULL, lpBytesRead может быть NULL. Если это перекрывающаяся операция чтения, вы можете получить количество прочитанных байтов, вызвав GetOverlappedResult. Если hNamedPipe связан с портом завершения ввода / вывода, вы можете получить количество прочитанных байтов, вызвав GetQueuedCompletionStatus.
(7) lpOverlapped — определяет указатель на перекрытую структуру. Эта структура требуется, если hNamedPipe был открыт с помощью FILE_FLAG_OVERLAPPED.
Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED, параметр lpOverlapped не должен быть NULL. Он должен указывать на действительную структуру OVERLAPPED.
Если hNamedPipe был создан с FILE_FLAG_OVERLAPPED и lpOverlapped имеет значение NULL, функция может неправильно сообщить о завершении операции.
Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED и lpOverlapped не равен NULL, TransactNamedPipe выполняется как перекрывающаяся операция. Структура OVERLAPPED должна содержать объект события с ручным сбросом (который может быть создан с помощью функции CreateEvent).
Если операция не может быть завершена немедленно, TransactNamedPipe возвращает FALSE, а GetLastError возвращает ERROR_IO_PENDING. В этой ситуации объект события устанавливается в состояние без сигнала перед возвратом TransactNamedPipe, и он устанавливается в состояние сигнала после завершения транзакции. Кроме того, вы можете получить уведомление о завершении перекрытой операции с помощью функций GetQueuedCompletionStatus или GetQueuedCompletionStatusEx. В этом случае вам не нужно присваивать событие ручного сброса в структуре OVERLAPPED, и завершение происходит с hNamedPipe так же, как и при асинхронной операции чтения или записи.
Если hNamedPipe не был открыт с FILE_FLAG_OVERLAPPED, TransactNamedPipe не вернется, пока операция не будет завершена.
Возвращаемое значение.
Если функция завершается успешно, возвращаемое значение равно TRUE.
Если функция завершается ошибкой, возвращаемое значение равно FALSE.
Если сообщение для чтения длиннее буфера, указанного в параметре nOutBufferSize, TransactNamedPipe возвращает FALSE, а функция GetLastError возвращает ERROR_MORE_DATA. Оставшаяся часть сообщения может быть прочитана последующим вызовом ReadFile, ReadFileEx или PeekNamedPipe.