Руководство программиста для Linux


Каналы - легкий путь! - часть 2


В качестве другого примера popen()-а, рассмотрим маленькую программу, открывающую два канала (один - для команды ls, другой - для сортировки): **************************************************************************** Excerpt from "Linux Programmer's Guide - Chapter 6" (C)opyright 1994-1995, Scott Burkett **************************************************************************** MODULE: popen2.c ****************************************************************************/ #include int main(void) { FILE *pipein_fp, *pipeout_fp; char readbuf[80]; /* Создаем односторонний канал вызовом popen() */ if (( pipein_fp = popen("ls", "r")) == NULL) { perror("popen"); exit(1); } /* Создаем односторонний канал вызовом popen() */ if (( pipeout_fp = popen("sort", "w")) == NULL) { perror("popen"); exit(1); } /* Цикл */ while(fgets(readbuf, 80, pipein_fp)) fputs(readbuf, pipeout_fp); /* Закрываем каналы */ pclose(pipein_fp); pclose(pipeout_fp); return(0); }

В качестве последней демонстрации popen(), давайте создадим программу, характерную для открытия канала между отданной командой и именем файла: /**************************************************************************** Excerpt from "Linux Programmer's Guide - Chapter 6" (C)opyright 1994-1995, Scott Burkett **************************************************************************** MODULE: popen3.c ****************************************************************************/ #include int main(int argc, char *argv[]) { FILE *pipe_fp, *infile; char readbuf[80]; if( argc != 3 ) { fpintf(stderr, "USAGE": popen3 [command] [filename]\n); exit(1); } /* Открываем вводимый файл */ if (( infile = popen(argv[2], "rt")) == NULL) { perror("fopen"); exit(1); } /* Создаем односторонний канал вызовом popen() */ if (( pipe_fp = popen(argv[1], "w")) == NULL) { perror("popen"); exit(1); } /* Цикл */ do { fgets(readbuf, 80, infile); if(feof(infile)) break; fputs(readbuf, pipe_fp); } while(!feof(infile)); fclose(infile); pclose(pipe_fp); return(0); }

Попробуйте выполнить эту программу с последующими заклинаниями: popen3 sort popen3.c popen3 cat popen3.c popen3 more popen3.c popen3 cat popen3.c | grep main




Начало  Назад  Вперед



Книжный магазин