Неименованный канал
Неименованный канал (англ. anonymous pipe) — один из методов межпроцессного взаимодействия (IPC) в операционной системе, который доступен связанным процессам — родительскому и дочернему. Представляется в виде области памяти на внешнем запоминающем устройстве, управляемой операционной системой, которая осуществляет выделение взаимодействующим процессам частей из этой области памяти для совместной работы. Организация данных в канале использует стратегию FIFO, то есть информация, которая первой записана в канал, будет первой прочитана из канала.
Важное отличие неименованного канала от файла заключается в том, что прочитанная информация немедленно удаляется из него и не может быть прочитана повторно. Выполнение вышеперечисленных системных вызовов может переводить процесс в состояние ожидания. Это происходит, если процесс пытается читать данные из пустого канала или писать данные в переполненный канал. Процесс выходит из ожидания, когда в канале появляются данные или когда в канале появляется свободное место, соответственно.
Двустороннее взаимодействие между процессами обычно требует наличия двух неименованных каналов.
Неименованные каналы в Unix
Для создания неименованного канала используется системный вызов pipe
. Массив из двух целых чисел является выходным параметром этого системного вызова. Если вызов выполнился нормально, то массив содержит два файловых дескриптора: для чтения информации из канала и для записи в него соответственно. Когда процесс порождает другой процесс, дескрипторы родителя наследуются дочерним процессом, и, таким образом, осуществляется связь между двумя процессами. Один из них использует канал только для чтения, а другой — только для записи. Поэтому, если, например, через канал должны передаваться данные из родительского процесса в дочерний, родительский процесс сразу после запуска дочернего процесса закрывает дескриптор канала для чтения, а дочерний процесс закрывает дескриптор для записи. Если нужен двунаправленный обмен данными, то родительский процесс создает два канала, один из которых используется для передачи данных в одну сторону, а другой — в другую.
Для записи информации в канал используется системный вызов write
. Для чтения информации из канала — системный вызов read
. Первый аргумент этих вызовов — дескриптор канала, имеющий тип int
, второй — указатель на область памяти, с которой происходит обмен, имеет тип void
, третий — количество байт, целочисленный тип. Оба вызова возвращают число переданных байт (либо значение «-1» при ошибке). При завершении использования канала процесс выполняет системный вызов close
.
Неименованные каналы в Windows
Как и множество других методов межпроцессного взаимодействия, неименованные каналы создаются и конфигурируются с помощью функций Windows API. CreatePipe
используется для создания неименованного канала. Данная функция возвращает два дескриптора (для чтения и записи в канал соответственно). Для того, чтобы дочерний процесс наследовал дескрипторы, необходимо создавать его функцией CreateProcess
с флагом наследования TRUE. Получив нужный дескриптор, процесс может далее взаимодействовать с каналом при помощи функций ReadFile
и WriteFile
, обеспечивающих чтение информации из канала и запись информации в канал соответственно. По окончании работы с каналом оба процесса должны закрыть дескрипторы при помощи функции CloseHandle
.