next up previous contents
Next: FIFO - именованные каналы. Up: Трубы (pipes) Previous: Использование труб.   Contents

Функция popen().

Чтобы избавить программиста от излишнего кода, для работы с трубами введена функция popen(). Синтаксис этой функции:

FILE *popen(const char* command, const char* mode);
Параметр command соответствует системному вызову команды, которая выполняет некоторую программу. Между процессом пользователя и вызванным процессом устанавливается труба для обмена информацией. Режим работы трубы устанавливается параметром mode. "r" означает чтение из трубы, а "w" - запись в трубу. В случае ошибки создания трубы popen() возвращает NULL, иначе возвращается указатель файла. Таким образом, функция popen() выполняет следующие действия:

Пример использования popen()(рис. 10):

#include <unistd.h>

#include <sys/wait.h>

#include <stdio.h>

#include <sys/types.h>

#include <fcntl.h>

#define EXIT(s) {fprintf(stderr, "%s",s); exit(0);}

#define USAGE(s) {fprintf(stderr, "%s Данные для чтения\n",s); exit(0);}

#define MAX 8192

enum {ERROR=-1,SUCCESS};

 

int main(int argc, char **argv)

{

  FILE *pipe_writer, *file;

  char buffer[MAX];

  if(argc!=2)

    USAGE(argv[0]);

  if((file=fopen(argv[1], "r")) == NULL)

    EXIT("Ошибка открытия файла.........\n");

  if(( pipe_writer=popen("./filter" ,"w")) == NULL)

    EXIT("Ошибка открытия трубы...........\n");

  while(1)

  {

    if(fgets(buffer, MAX, file) == NULL)

    break;

    if(fputs(buffer, pipe_writer) == EOF)

      EXIT("Ошибка записи........\n");

  }

  pclose(pipe_writer);

}

Рис. 10. Взаимодействие с помощью popen().



2003-12-09