栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

linux c语言实现文件重定向功能

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux c语言实现文件重定向功能

要求:job5增加文件重定向功能



思路

1:分割字符串,提取信息2:在子进程中利用dup2命令按需要将标准输入输出重定向为指定的输入输出来源


代码
#include
#include
#include
#include
#include
#include
#include

char op[100],t[100],p[100],r[100],q[100];
int st[10];

char *argv[10]; //把命令按空格划分
int argc=0;  //命令以空格分割后个单词个数
char *input; //输入地址,若无重定向,默认为NULL,若重定向了,则为重定向地址
char *output;//输出的地址,若无重定向,默认为NULL,若重定向了,则为重定向的地址
int mode=0; //如果重定向了输出,mode为0表示覆盖输出,为1表示追加输出

void parse_command(char *command)
{ //把输入的命令串处理“分割”,提取有用信息
	//init
	memset(st,0,sizeof(st));
	mode=0;
	input=NULL;
	output=NULL;
	//分割字符串
	char *ptr;
	int i=0;
	ptr=NULL;
	ptr=strtok(command," ");
	while(ptr)
	{
		argv[i]=ptr;
		++i;
		ptr=strtok(NULL," ");
	}
	argv[i]=NULL;
	argc=i;
	//遍历所有单词,查找重定向
	for(int i=1;i')  //重定向输出
		{  //提取地址
			int k=0;
			for(int j=1;op[j]!='';j++)
			{
				if(op[j]=='>') continue;
				t[k++]=op[j];
			}
			t[k]='';
			
			if(t[0]!='/')
			{
				getcwd(p,sizeof(p));
				
				strcat(p,"/");
				strcat(p,t);
				
				output=p;
				
			}
			else
				output=t;
			if(op[1]=='>')
				mode=1;
			
			st[i]=1;//标记一下,后面要在命令串中把这个筛掉
		}		
	}
	//在分割后的命令串中把重定向了的部分筛掉,因为他们不能再往下传了
	char *tmp[10];     
	int k=0;
	for(int i=0;i");
		gets(str);
		mysys(str);
	}
	return 0;
}

注意点

这里的文件重定向操作是在子进程里完成,而不是在主进程里完成
如果是在主进程里进行操作,会影响主进程的后续操作。可以写一个parse_command函数,统一把字符串处理到位,把需要的信息都给处理出来,然后再写一个统一的输出函数dump_command()进行检验,把需要的信息可以开成全局变量,这样不用作为函数的参数传来传去,从全局的角度来看,更加直观,不易出错。这里遍历命令单词串,查找带重定向符的单词时,最好要用不同的char型数组、指针,这样可以避免在循环中的先后操作而产生的覆盖问题,比如查找<操作符时,用了r和q,而查找>操作符时,用了t和p打开文件的时候,要注意选用的参数
打开一个想要读的文件:fd1=open(input,O_RDONLY);
打开一个想要覆盖写的文件:fd2=open(output,O_CREAT|O_TRUNC|O_WRONLY,0666);
打开一个想要追加写的文件:fd2=open(output,O_CREAT|O_APPEND|O_WRONLY,0666);对echo命令而言,重定向输入符<是没有意义的,所以不需要考虑

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779184.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号