Каналы (неименованные каналы)

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

На языке командных интерпретаторов канал обозначается символом I. В некоторых источниках он именуется конвейером и служит средством группирования команд. Наиболее часто канал используется при выводе на экран файлов большой длины. Так, чтобы последовательно просмотреть листинг файлов в каталоге большого объема, используют команду Is -la /bin | more. Команда more как раз и обеспечивает поэкранный вывод данных с возможностью «листать» страницы вперед при нажатии любой клавиши. Комбинированная команда Is -la /bin | less позволяет постранично «листать» файл в обе стороны. Правда, при работе в графическом режиме и эмуляции текстового терминала в окне просматривать файл можно и без дополнительных команд, используя для этого боковые полосы прокрутки.

Еще несколько примеров использования каналов:

cat file_name|wc

Утилита cat читает текстовый файл file_name и передает последовательный поток символов программе wc, которая подсчитывает число строк, слов и символов в файле,

ps -ef | head -20

Утилита ps выводит таблицу процессов, а утилита head отображает первые 20 строк этой таблицы,

dd if=/dev/fd0 | grep "Linux"

Утилита dd читает по секторам дискету, a grep ищет в считываемых данных строку "Linux".

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