Операционная система UNIX. Руководство программиста

       

Каналы


В окружении ОС UNIX при работе в рамках shell'а часто используются каналы, то есть выполнение программ огранизуется таким образом, что вывод одной программы является вводом другой. Например, чтобы узнать количество архивных файлов на Вашем компьюте- ре, можно ввести следующую команду:

echo /lib/*.a /usr/lib/*.a | wc -w

Эта команда выводит имена всех файлов из каталогов /lib и /usr/lib, оканчивающиеся на .a, и направляет результат команде wc(1), которая подсчитывает количество файлов.

Особенностью интерфейса между ОС UNIX и языком C является возможность создания каналов между Вашим процессом и выполняемой shell'ом командой, или между двумя взаимодействующими процесссами. В первом случае используется функция popen(3S), входящая в стандартный пакет ввода/вывода, а во втором - системный вызов pipe(2).

Функция popen() напоминает функцию system() тем, что она вызывает выполнение указанной команды shell'а. Отличие заключается в том, что при использовании функции popen() между вызвавшей ее программой и командой создается канал. С помощью функций пакета стандартного ввода/вывода можно выводить символы и цепочки символов в этот канал точно так же, как в stdout или именованные файлы. Канал остается открытым до тех пор, пока не будет вызвана функция pclose(). Типичным применением popen() является организация канала для выдачи информации на устройство печати командой lp(1):

#include <stdio.h>

main () { FILE *pptr; char *outstring;

if ((pptr = popen ("lp", "w")) != NULL) { for (;;) { . . . /* Организация вывода */ . . . (void) fprintf (pptr, "%s\n", outstring); . . . } . . . pclose (pptr); } . . . }



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