歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 《APUE》:使用popen調用過濾程序

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

日期:2017/3/1 10:08:38   编辑:Linux編程

《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. int main()
  5. {
  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;
  19. }

客戶端程序:

  1. //《APUE》程序15-7:調用過濾程序的客戶端程序
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/wait.h>
  6. //每次讀取文件字符的長度
  7. #define MAXLINE 4096
  8. //輸出錯誤信息並退出
  9. void error_quit(const char *str)
  10. {
  11. fprintf(stderr, "%s\n", str);
  12. exit(1);
  13. }
  14. int main()
  15. {
  16. char line[MAXLINE];
  17. FILE *fpin;
  18. //創建管道,並將其鏈接到後台程序中
  19. //popen() 函數通過創建一個管道,調用fork產生一個子進程,
  20. //執行一個shell以運行命令來開啟一個進程。
  21. fpin = popen("./myuclc", "r");
  22. if( NULL == fpin )
  23. error_quit("popen error");
  24. while( 1 )
  25. {
  26. //輸出提示(因為不含回車符,所以要手動刷新
  27. fputs("prompt> ", stdout);
  28. fflush(stdout);
  29. //向後台程序輸入在終端輸入的字符串
  30. if( fgets(line, MAXLINE, fpin) == NULL )
  31. break;
  32. //將後台程序的輸出輸出到終端
  33. if( fputs(line, stdout) == EOF )
  34. error_quit("fputs error to pipe");
  35. }
  36. //結束後台程序,並關閉管道
  37. if( pclose(fpin) == -1 )
  38. error_quit("pclose error");
  39. putchar('\n');
  40. return 0;
  41. }

運行示例(紅色字體的為輸入):

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