《APUE》:使用popen调用过滤程序
《APUE》:使用popen调用过滤程序
《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。
程序简介:本例子包含两个程序:
1:后台程序myuclc:它能将标准输入复制到标准输出,并在复制时能所有的大写字母变为小写字母。
2:客户端程序temp:它首先输入提示,让用户输入字符串,并调用后台程序对字符串进行处理,并输出结果。
相关链接
- 《UNIX环境高级编程》(第二版)apue.h的错误
- Unix环境高级编程 源代码地址
后台程序:
- //《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.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结束程序
评论暂时关闭