Системное программирование в UNIX средствами Free Pascal

Каналы на уровне команд


Большинство пользователей UNIX уже сталкивались с конвейерами команд:

$ pr doc | lр

Этот конвейер организует совместную работу команд pr и lр. Символ | в командной строке сообщает командному интерпретатору, что необходимо создать канал, соединяющий стандартный вывод команды pr

со стандартным вводом команды lр. В результате этой команды на матричный принтер будет выведена разбитая на страницы версия файла doc.

Разобьем командную строку на составные части. Программа pr слева от символа, обозначающего канал, ничего не знает о том, что ее стандартный вывод посылается в канал. Она выполняет обычную запись в свой стандартный вывод, не предпринимая никаких особых мер. Аналогично программа lр

справа выполи чтение точно так же, как если бы она получала свой стандартный ввод с клавиатуры или из обычного файла.[10]

Результат в целом будет таким же, как при выполнении следующей последовательности команд:

$ pr doc > tmpfile

$ lр < tmpfile

$ rm tmpfile

Управление потоком в канале осуществляется автоматически и прозрачно для процесса. Поэтому, если программа pr будет выводить информацию слишком быстро, то ее выполнение будет приостановлено. После того как программа lр

догонит программу pr, и количество данных, находящихся в канале, упадет до приемлемого уровня, выполнение программы pr

продолжится.

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

$ who | wc -l

направляет вывод программы who в программу подсчета числа слов wc, а задание параметра -l

в программе wc

определяет, что необходимо подсчитывать только число строк. Таким образом, в конечном итоге программа

wc выводит число находящихся в системе пользователей (иногда нужно исключить из суммы первую строку-заголовок вывода who).



Содержание раздела