Неименованный канал

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
Схема взаимодействия процессов с помощью неименованного канала в Unix.

Неименованный канал (англ. anonymous pipe) — один из методов межпроцессного взаимодействия (IPC) в операционной системе, который доступен связанным процессам — родительскому и дочернему. Представляется в виде области памяти на внешнем запоминающем устройстве, управляемой операционной системой, которая осуществляет выделение взаимодействующим процессам частей из этой области памяти для совместной работы. Организация данных в канале использует стратегию FIFO, то есть информация, которая первой записана в канал, будет первой прочитана из канала.

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

Двустороннее взаимодействие между процессами обычно требует наличия двух неименованных каналов.

Неименованные каналы в Unix

Для создания неименованного канала используется системный вызов pipe. Массив из двух целых чисел является выходным параметром этого системного вызова. Если вызов выполнился нормально, то массив содержит два файловых дескриптора: для чтения информации из канала и для записи в него соответственно. Когда процесс порождает другой процесс, дескрипторы родителя наследуются дочерним процессом, и, таким образом, осуществляется связь между двумя процессами. Один из них использует канал только для чтения, а другой — только для записи. Поэтому, если, например, через канал должны передаваться данные из родительского процесса в дочерний, родительский процесс сразу после запуска дочернего процесса закрывает дескриптор канала для чтения, а дочерний процесс закрывает дескриптор для записи. Если нужен двунаправленный обмен данными, то родительский процесс создает два канала, один из которых используется для передачи данных в одну сторону, а другой — в другую.

Для записи информации в канал используется системный вызов write. Для чтения информации из канала — системный вызов read. Первый аргумент этих вызовов — дескриптор канала, имеющий тип int, второй — указатель на область памяти, с которой происходит обмен, имеет тип void, третий — количество байт, целочисленный тип. Оба вызова возвращают число переданных байт (либо значение «-1» при ошибке). При завершении использования канала процесс выполняет системный вызов close.

Неименованные каналы в Windows

Как и множество других методов межпроцессного взаимодействия, неименованные каналы создаются и конфигурируются с помощью функций Windows API. CreatePipe используется для создания неименованного канала. Данная функция возвращает два дескриптора (для чтения и записи в канал соответственно). Для того, чтобы дочерний процесс наследовал дескрипторы, необходимо создавать его функцией CreateProcess с флагом наследования TRUE. Получив нужный дескриптор, процесс может далее взаимодействовать с каналом при помощи функций ReadFile и WriteFile, обеспечивающих чтение информации из канала и запись информации в канал соответственно. По окончании работы с каналом оба процесса должны закрыть дескрипторы при помощи функции CloseHandle.

Ссылки