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


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

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

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

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

相关链接

  • 《UNIX环境高级编程》(第二版)apue.h的错误
  • Unix环境高级编程 源代码地址

后台程序:

  1. //《APUE》程序15-6:将大写字母变成小写字母的过滤程序  
  2. #include <stdio.h>  
  3. #include <ctype.h>  
  4.  
  5. int main() 
  6.     int c; 
  7.     while( 1 ) 
  8.     { 
  9.         c = getchar(); 
  10.         if( EOF == c ) 
  11.             break
  12.         if( isupper(c) ) 
  13.             c = tolower(c); 
  14.         putchar(c); 
  15.         if'\n' == c ) 
  16.             fflush(stdout); 
  17.     } 
  18.     return 0; 

客户端程序:

  1. //《APUE》程序15-7:调用过滤程序的客户端程序  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <unistd.h>  
  5. #include <sys/wait.h>  
  6.  
  7. //每次读取文件字符的长度   
  8. #define MAXLINE 4096   
  9.  
  10. //输出错误信息并退出       
  11. void error_quit(const char *str)       
  12. {       
  13.     fprintf(stderr, "%s\n", str);       
  14.     exit(1);       
  15. }   
  16.  
  17. int main() 
  18.     char line[MAXLINE]; 
  19.     FILE *fpin; 
  20.      
  21.     //创建管道,并将其链接到后台程序中  
  22.     //popen() 函数通过创建一个管道,调用fork产生一个子进程,  
  23.     //执行一个shell以运行命令来开启一个进程。  
  24.     fpin = popen("./myuclc""r"); 
  25.     if( NULL == fpin ) 
  26.         error_quit("popen error"); 
  27.  
  28.     while( 1 ) 
  29.     { 
  30.         //输出提示(因为不含回车符,所以要手动刷新  
  31.         fputs("prompt> ", stdout); 
  32.         fflush(stdout); 
  33.  
  34.         //向后台程序输入在终端输入的字符串  
  35.         if( fgets(line, MAXLINE, fpin) == NULL ) 
  36.             break
  37.         //将后台程序的输出输出到终端  
  38.         if( fputs(line, stdout) == EOF ) 
  39.             error_quit("fputs error to pipe"); 
  40.     } 
  41.  
  42.     //结束后台程序,并关闭管道  
  43.     if( pclose(fpin) == -1 ) 
  44.         error_quit("pclose error"); 
  45.  
  46.     putchar('\n'); 
  47.     return 0; 

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

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

相关内容