[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Функции стандартной библиотеки для работы с каналами

Библиотечные функция  popen(3S) для  работы с  каналами  настолько  же
удобна, как fopen(3) для работы с обычными файлами. Вместо имени файла
вы передаете  командную строку  shell как  один аргумент.  Так же, как
fopen(3),  popen(3S)   возвращает  указатель   на  тип   FILE.   Затем
стандартные библиотечные  функции, такие, как printf, используются для
ввода и  вывода. Наконец,  когда вы закончите, вы закрываете указатель
на файл с использованием pclose(3) вместо fclose(3).

Как правило,  проще использовать  popen(3) и  pclose(3), чем системные
вызовы, для кода, выполняющего одни и те же функции.

Аргументы popen(3):
command - указатель на строку символов, содержащую любую правильную
команду интерпретатора shell. Эта командная строка может использовать
все механизмы shell'а, такие как поиск команд в PATH, расширение
метасимволов, перенаправление ввода/вывода и т.д.. Это работает
потому, что popen(3) исполняет shell и передает ему эту командную
строку как аргумент.
type - "r" для чтения и "w" для записи. Выбор "r" или "w" определяется
тем, как программа будет использовать полученный указатель на файл.
   . type  должен   быть  "r",  если  программа  хочет  читать  вывод,
      производимый стандартным выводом command.

   . type должен  быть "w",  если вывод в полученный указатель на файл
      должен быть стандартным вводом command.

Возвращаемое значение popen(3) - указатель на стандартный библиотечный
тип FILE.

Аргументы pclose(3) таковы:
  stream - указатель на FILE, полученный при вызове popen(3).

pclose(3) возвращает выходной статус команды, когда она завершается.
         ФУНКЦИИ СТАНДАРТНОЙ БИБЛИОТЕКИ ДЛЯ РАБОТЫ С КАНАЛАМИ


popen(3S)

ИМЯ

          popen, pclose - инициализировать программный канал для ввода
          или вывода порожденного процесса


ИСПОЛЬЗОВАНИЕ

#include <stdio.h>

FILE *popen (const char *command,const char *type)
int pclose (FILE *stream)


ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

          успех - popen: указатель на файл
               pclose: статус подпроцесса

          неуспех - popen: нулевой указатель
               pclose: -1
  Функции стандартной библиотеки для работы с каналами - Иллюстрация

Традиционные библиотечные  функции для  работы с каналами - popen(3) и
pclose(3).  SVR4   добавляет  функции  p2open(3G)  и  p2close(3G).  Их
действия  аналогичны,  но  popen(3S)  создает  однонаправленную  линию
связи,  а   p2open(3G)  -   двунаправленную  линию   для  связи  между
родительским и порожденным процессами.

Сначала popen(3)  создает канал,  затем порождает процесс, исполняющий
команду, заданную  первым аргументом,  и перенаправляет ее стандартный
ввод или  вывод. Соответственно,  pclose(3)  закрывает  канал  и  ждет
завершения порожденного процесса.

Используя  popen(3)  и  pclose(3),  программа  может  исполнить  любую
допустимую команду,  которая может  быть набрана  в  командной  строке
входного  интерпретатора   shell.  Затем  программа  может  читать  со
стандартного вывода этой команды или писать в ее стандартный ввод.

Функция popen(3)  реализована с  использованием pipe(2)  для  создания
канала, fork(2)  для запуска  подпроцесса и dup(2) для перенаправления
стандартного ввода  или вывода  в канал.  Функция  pclose(3),  в  свою
очередь, использует close(2), чтобы закрыть канал, и wait(2) для того,
чтобы  дождаться   завершения  порожденного   процесса.  На  диаграмме
пунктирная  линия   показывает,  что   родительский  процесс,  ожидает
завершения своего подпроцесса.