UNIX — универсальная среда программирования | страница 31



>$ sort

>ghi

>abc

>def

>ctl-c

>abc

>def

>ghi

>$

В дальнейшем мы покажем, как реализуется этот принцип.

Упражнение 1.5

Объясните, почему команда

>$ ls > ls.out

включает >ls.out в список имен.

Упражнение 1.6

Объясните результат выполнения команды

>$ wc temp > temp

Что произойдет, если вы ошибетесь в имени команды, задав

>$ woh > temp

Программные каналы

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

Пересмотрим теперь некоторые из предыдущих примеров с точки зрения использования программных каналов вместо временных файлов. Вертикальная черта служит указанием интерпретатору >shell для создания конвейера:

>$ who | sort      Печать отсортированного списка пользователей

>$ who | wc -l     Подсчет числа пользователей

>$ ls | wc -l      Подсчет числа файлов

>$ ls | pr -3      Вывод списка имен файлов в три столбца

>$ who | grep mary Поиск определенного пользователя

Всякая программа, вводящая информацию с терминала, может вводить ее и по программному каналу; всякая программа, производящая вывод на терминал, может выдавать информацию в программный канал. Это тот случай, когда приносит плоды решение читать стандартный входной поток, если не заданы никакие файлы. Любая программа, выполняющая данное соглашение, может быть включена в конвейер. В рассмотренных выше примерах команды >pr, >grep, >sort и >wc используются именно таким способом.

Можно связать конвейером сколь угодно много программ. Например,

>$ ls | pr -3 | lpr

создает список имен файлов в три столбца и выдает его на печатающее устройство, а

>$ who | grep mary | wc -l

подсчитывает, сколько раз пользователь Мэри входила в систему.

Программы, связанные конвейером, выполняются одновременно, а не последовательно одна за другой. Это означает, что программы в конвейере могут вступать в диалог; ядро выполняет необходимые операции переключения и синхронизации, чтобы такая схема работала. Большинство команд следует определенному образцу, поэтому они хорошо вписываются в конвейер и могут выполняться в нем на любом месте. Обычный вызов команды имеет вид: