现在的位置: 首页 > 综合 > 正文

《Unix环境高级编程》:使用popen调用过滤程序

2012年04月17日 ⁄ 综合 ⁄ 共 1282字 ⁄ 字号 评论关闭

《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结束程序

抱歉!评论已关闭.