Операции анонимного канала
Функция CreatePipe создает анонимный канал и возвращает два дескриптора: дескриптор чтения в канал и дескриптор записи в канал. Дескриптор чтения имеет доступ только для чтения к каналу, а дескриптор записи имеет доступ только для записи к каналу. Для обмена данными с помощью канала сервер канала должен передать дескриптор канала другому процессу. Обычно это делается с помощью наследования; то есть процесс позволяет наследовать дескриптор дочерним процессом. Процесс также может дублировать дескриптор канала с помощью функции DuplicateHandle и отправлять его в несвязанный процесс с помощью некоторой формы взаимодействия между процессами, например DDE или общей памяти.
Сервер канала может отправлять дескриптор чтения или дескриптор записи клиенту канала в зависимости от того, должен ли клиент использовать анонимный канал для отправки информации или получения информации. Чтобы прочитать из канала, используйте дескриптор чтения канала в вызове функции ReadFile. Вызов ReadFile возвращается, когда другой процесс записывается в канал. Вызов ReadFile также может возвращать, если все дескриптор записи в канал был закрыт или возникает ошибка до завершения операции чтения.
Чтобы записать в канал, используйте дескриптор записи канала в вызове функции WriteFile. Вызов writeFile не возвращается, пока не будет записано указанное число байтов в канал или возникает ошибка. Если буфер канала заполнен и есть больше байтов для записи, WriteFile не возвращается до тех пор, пока другой процесс не считывается из канала, что делает больше буферного пространства доступным. Сервер канала задает размер буфера для канала при вызове CreatePipe.
Асинхронные (перекрывающиеся) операции чтения и записи не поддерживаются анонимными каналами. Это означает, что нельзя использовать функции ReadFileEx и WriteFileEx с анонимными каналами. Кроме того, параметр lpOverlappedReadFile и WriteFile игнорируется при использовании этих функций с анонимными каналами.
Анонимный канал существует до тех пор, пока все дескрипторы канала не будут закрыты как для чтения, так и записи. Процесс может закрыть дескриптор канала с помощью функции CloseHandle. Все дескрипторы канала также закрываются при завершении процесса.
Анонимные каналы реализуются с помощью именованного канала с уникальным именем. Таким образом, можно часто передавать дескриптор в анонимную трубу в функцию, требующую дескриптора в именованный канал.