以命令行为参数的管道通信

命令格式

#include <stdio.h>
#include <sys/types.h>
#include <ctype.h>
FILE popen(const char cmdstring,const char type);
int pclose(FILE *fp);


cmdstring是shell要求的一个完整的命令行参数和选项。type指出管道访问方式:读(r)或写(w).若管道的type为r,那么管道的输入端与命令行cmdstring的标准输出端相连。也即,父进程以r方式打开管道并成功地获得管道文件的指针,被创建的子进程执行命令行,向管道输出。若管道的type为w,那么管道的输出端与命令行cmdstring的标准输入端相连。也即,父进程以w方式打开管道并成功地获得管道文件的指针,被关键的子进程执行命令行,从管道读入。

popen和pclose这两个函数的作用类似于fopen和fclose函数。popen用于创建管道,函数内部完成fork()和exec()函数的调用,并执行命令串cmdstring,返回一个FILE结构的指针,用于访问管道。pclose()用来关闭管道,关闭标准输入输出流,等待命令行执行完后返回结束时的状态。若命令行不能正确执行,返回-1.

下面是一个以命令行为参数的管道文件的实例。

假设有一个可执行程序chcase,从标准输入设备读字符,将小写字母转换成大写字母并进行输出。主程序使用popen创建管道,事先将某文本文件中小写字母转换成大写字母。其中的文本文件名作为参数传进来。

首先是chcase源程序

#include<stdio.h>
#include<string.h>
int main()
{
 char c1[30];
 int i,a;
 scanf("%s",c1);
 a=strlen(c1); 
 for(i=0;i<a;i++)
   {
      c1[i]=c1[i]-32;
   }
 printf("%s\n",c1);
 return 0;
} 


接下来是主程序

#include<stdio.h>
#include<sys/types.h>
#include<ctype.h>
#include<sys/wait.h>
#include<stdlib.h>
int MAXLINE=50;

int main(int argc,char * argv[])
{
	char line[MAXLINE];
	FILE * fpin,*fpout;
	//检查输入的命令行有无带参数
	if(argc!=2)
	{
		fprintf(stderr,"usage:a.out<pathname>\n");
		exit(1);
	}
	//打开文本文件
	
	if((fpin=fopen(argv[1],"r"))==NULL)
	{
		fprintf(stderr,"can't open %s\n",argv[1]);
		exit(1);
	}
	
	//创建写类型通道
	if((fpout=popen("/home/test/codespace/chcase","w"))==NULL)
	{
		fprintf(stderr,"popen error\n");
		exit(1);
	}
	//从文件中读出数据,写入管道中
	while((fgets(line,MAXLINE,fpin)!=NULL))
	{
		if(fputs(line,fpout)==EOF)
		{
			fprintf(stderr,"fputs error to pipe.\n");
			exit(1);		
		}	
	}
	//判断读文件是否有错误
	if(ferror(fpin))
	{
	 	fprintf(stderr,"fgets error.\n");
		exit(1);
	}
	//关闭管道
	if(pclose(fpout)==-1)
	{
		fprintf(stderr,"pclose error.\n");
		exit(1);
	}
	exit(0);
}


 

说明:先打开文本文件,通过函数popen()创建一个可写管道,将命令行chcase的输入与管道的输出连接起来,然后想管道输入数据,那么,命令行就可以通过管道接受文本文件的数据了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值