命令格式
#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的输入与管道的输出连接起来,然后想管道输入数据,那么,命令行就可以通过管道接受文本文件的数据了
483

被折叠的 条评论
为什么被折叠?



