首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

《APUE》:运用popen调用过滤程序

2012-10-14 
《APUE》:使用popen调用过滤程序《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,

《APUE》:使用popen调用过滤程序

《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。


程序简介:本例子包含两个程序:

1:后台程序myuclc:它能将标准输入复制到标准输出,并在复制时能所有的大写字母变为小写字母。

2:客户端程序temp:它首先输入提示,让用户输入字符串,并调用后台程序对字符串进行处理,并输出结果。


后台程序:

//《APUE》程序15-7:调用过滤程序的客户端程序#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>//每次读取文件字符的长度  #define MAXLINE 4096  //输出错误信息并退出      void error_quit(const char *str)      {      fprintf(stderr, "%s\n", str);      exit(1);      }  int main(){char line[MAXLINE];FILE *fpin;//创建管道,并将其链接到后台程序中//popen() 函数通过创建一个管道,调用fork产生一个子进程,//执行一个shell以运行命令来开启一个进程。fpin = popen("./myuclc", "r");if( NULL == fpin )error_quit("popen error");while( 1 ){//输出提示(因为不含回车符,所以要手动刷新fputs("prompt> ", stdout);fflush(stdout);//向后台程序输入在终端输入的字符串if( fgets(line, MAXLINE, fpin) == NULL )break;//将后台程序的输出输出到终端if( fputs(line, stdout) == EOF )error_quit("fputs error to pipe");}//结束后台程序,并关闭管道if( pclose(fpin) == -1 )error_quit("pclose error");putchar('\n');return 0;}


运行示例(红色字体的为输入):

qch@ubuntu:~/code$gcc myuclc.c -o myuclc
qch@ubuntu:~/code$ gcc temp.c -o temp
qch@ubuntu:~/code$ ./temp
prompt> AFSDFSADF
afsdfsadf
prompt> flsSDFSSLFddsfd
flssdfsslfddsfd
#按Ctrl+D结束程序

热点排行