歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

《APUE》:使用popen調用過濾程序

《Unix環境高級編程》這本書附帶了許多短小精美的小程序,我在閱讀此書的時候,將書上的代碼按照自己的理解重寫了一遍(大部分是抄書上的),加深一下自己的理解(純看書太困了,呵呵)。此例子在Ubuntu10.04上測試通過。

程序簡介:本例子包含兩個程序:

1:後台程序myuclc:它能將標准輸入復制到標准輸出,並在復制時能所有的大寫字母變為小寫字母。

2:客戶端程序temp:它首先輸入提示,讓用戶輸入字符串,並調用後台程序對字符串進行處理,並輸出結果。

相關鏈接

  • 《UNIX環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm
  • Unix環境高級編程 源代碼地址 http://www.linuxidc.com/Linux/2011-04/34826.htm

後台程序:

  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.linuxidc.com @ubuntu:~/code$ gcc myuclc.c -o myuclc
www.linuxidc.com @ubuntu:~/code$ gcc temp.c -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp
prompt> AFSDFSADF
afsdfsadf
prompt> flsSDFSSLFddsfd
flssdfsslfddsfd
#按Ctrl+D結束程序

Copyright © Linux教程網 All Rights Reserved