《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
後台程序:
- //《APUE》程序15-6:將大寫字母變成小寫字母的過濾程序
- #include <stdio.h>
- #include <ctype.h>
-
- int main()
- {
- int c;
- while( 1 )
- {
- c = getchar();
- if( EOF == c )
- break;
- if( isupper(c) )
- c = tolower(c);
- putchar(c);
- if( '\n' == c )
- fflush(stdout);
- }
- return 0;
- }
客戶端程序:
- //《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;
- }
運行示例(紅色字體的為輸入):
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結束程序