Поделиться через


Операции с анонимным каналом

Функция CreatePipe создает анонимный канал и возвращает два дескриптора: дескриптор чтения в канал и дескриптор записи в канал. Дескриптор чтения имеет доступ только для чтения к каналу, а дескриптор записи — доступ только для записи к каналу. Для обмена данными с помощью канала сервер канала должен передать дескриптор канала другому процессу. Как правило, это делается через наследование; то есть процесс позволяет наследовать дескриптор дочерним процессом. Процесс также может дублировать дескриптор канала с помощью функции DuplicateHandle и отправить его в несвязанный процесс с помощью некоторой формы межпроцессного взаимодействия, например DDE или общей памяти.

Сервер канала может отправлять дескриптор чтения или дескриптор записи клиенту канала в зависимости от того, должен ли клиент использовать анонимный канал для отправки или получения информации. Для чтения из канала используйте дескриптор чтения канала в вызове функции ReadFile . Вызов ReadFile возвращается, когда другой процесс записывает данные в канал. Вызов ReadFile также может возвращать, если все дескрипторы записи в канал были закрыты или если произошла ошибка до завершения операции чтения.

Для записи в канал используйте дескриптор записи канала в вызове функции WriteFile . Вызов WriteFile не возвращается, пока не будет записано указанное количество байтов в канал или не возникнет ошибка. Если буфер канала заполнен и нужно записать больше байтов, WriteFile не возвращается до тех пор, пока другой процесс не считывает данные из канала, что делает буфер доступным. Сервер канала задает размер буфера для канала при вызове CreatePipe.

Асинхронные (перекрывающиеся) операции чтения и записи не поддерживаются анонимными каналами. Это означает, что нельзя использовать функции ReadFileEx и WriteFileEx с анонимными каналами. Кроме того, параметр lpOverlappedдля ReadFile и WriteFile игнорируется при использовании этих функций с анонимными каналами.

Анонимный канал существует до тех пор, пока не будут закрыты все дескрипторы канала, как для чтения, так и для записи. Процесс может закрыть дескрипторы канала с помощью функции CloseHandle . Все дескрипторы канала также закрываются при завершении процесса.

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