Двунаправленные каналы. Функция open(), применяемая для открытия канала, и функция pipe() создают однонаправленные дескрипторы файлов. Если нужно выполнять и чтение, и завись в другой процесс, это сделать не так-то просто. В частности, следующая синтаксическая конструкция, которая с виду кажется вполне приемлемой, работать не будет: open(FH,"|$cmd|");
Один из способов решения этой задачи состоит в том, что функция pipe() вызывается два раза и создаются две пары связанных дескрипторов файлов. Одна пара применяется для записи из родительского процесса в дочерний, а другая - из дочернего в родительский; это во многом аналогично тому, как движутся транспортные потоки по скоростному шоссе с двухсторонним движением. Здесь данный метод не рассматривается, но именно так применяются стандартные модули IPC::Open2 и IPC::ОреnЗ для создания дескрипторов файлов, подключенных к дескрипторам файлов STDIN, STDOUT и STDERR подпроцесса.
Более изящный способ состоит в создании двунаправленного канала с помощью функции socketpair(). Эта функция создает два связанных дескриптора файлов, как и функция pipe(), но оба они предназначены не для односторонней связи, а для чтения/записи. Данные, записанные в один дескриптор файла, поступают из другого, и наоборот. Поскольку функция socketpair() основана на тех же принципах, что и функции socket(), применяемая для связи по сети.