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

SVR4 предоставляет  p2open(3G), который  похож на  popen(3S) тем,  что
запускает в порожденном процессе shell-команду и устанавливает связь с
этим процессом  через канал.  Он  отличается  от  popen(3S)  тем,  что
предоставляет двунаправленную связь.

p2open(3G) разветвляется (т.е. вызывает fork(2)) и исполняет командную
строку, на  которую  указывает  cmd.  При  возврате,  ptr[0]  содержит
указатель на  FILE, запись в который будет стандартным вводом команды.
ptr[1] содержит  указатель на файл, который может быть использован для
чтения стандартного вывода команды.

p2close(3G) закрывает  оба указателя  на FILE.  Если программист хочет
закрыть  один   из  потоков,  он  может  использовать  для  этой  цели
fclose(3S).  Это  необходимо,  если  команда  является  фильтром,  как
sort(1), который  должен увидеть  конец файла  перед тем,  как  начать
обработку ввода.
        СТАНДАРТНЫЕ БИБЛИОТЕЧНЫЕ ФУНКЦИИ ДЛЯ РАБОТЫ С КАНАЛАМИ

p2open(3G)

ИМЯ

          p2open, p2close - открывает и закрывает программные каналы
          для стандартных ввода и вывода команды

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

     cc [flag ...] file ... -lgen [library ...]

     #include <libgen.h>
     int p2open (const char *command, FILE *fp[2]);
     int p2close (FILE *fp[2]);

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

          успех - p2open: pid подпроцесса
               p2close: статус подпроцесса

          неуспех - p2open: 0
               p2close: -1
   Библиотечные функции для работы с каналами - Пример - p2open(3G)

Эта   программа    демонстрирует    использование    p2open(3G)    для
двунаправленной связи  между родительским  и  порожденным  процессами.
Родительский процесс  пишет  в  стандартный  ввод  порожденного  через
fptr[0] и  читает его  стандартный вывод  из fptr[1]. В этой программе
важно, что  родитель делает  fclose(3S) для  того файла,  в который он
писал, так  что команда  sort(1) исполняющаяся  в подпроцессе,  увидит
конец файла.

Эта программа работает так:
$ p2exam
Sorted line 0: zfk
Sorted line 1: sdcjjden
Sorted line 2: njkdnk
Sorted line 3: ldef
Sorted line 4: bfifim

Файл: p2exam.c
   БИБЛИОТЕЧНЫЕ ФУНКЦИИ ДЛЯ РАБОТЫ С КАНАЛАМИ - ПРИМЕР - p2open(3G)

 1       #include <stdio.h>
 2       #include <libgen.h>
 3
 4       main()
 5       {
 6       FILE *fptrs[2];
 7       int i, pid;
 8       char buf[79];
 9       char *lines[5] = {"njkndk\n",
10       "sdcjjden\n",
11       "ldef\n",
12       "bfifim\n",
13       "zfk\n" };
14
15
16       p2open("/bin/sort -r", fptrs);
17
18       for( i=0; i < 5; i++)
19       fputs(lines[i], fptrs[0]);
20       fclose(fptrs[0]);
21
22       i = 0;
23       while(fgets(buf, 80, fptrs[1]) != NULL) {
24       printf("Sorted line %d: %s", i++, buf);
25       }
26       }