《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。
程序简介:本例子包含两个程序:
1:后台程序myuclc:它能将标准输入复制到标准输出,并在复制时能所有的大写字母变为小写字母。
2:客户端程序temp:它首先输入提示,让用户输入字符串,并调用后台程序对字符串进行处理,并输出结果。
后台程序:
//《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;
}
运行示例(红色字体的为输入):
qch@ubuntu:~/code$gcc myuclc.c -o myuclc
qch@ubuntu:~/code$ gcc temp.c -o temp
qch@ubuntu:~/code$ ./temp
prompt> AFSDFSADF
afsdfsadf
prompt> flsSDFSSLFddsfd
flssdfsslfddsfd
#按Ctrl+D结束程序