操作系统shell命令解析器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一.程序概述1.完成的任务在Linux环境下编写一个简单的命令解释器即定义一个命令使它具有Linux中某些命令的功能,可以实现获取用户输入的指令、可解析指令、可执行命令等功能,以此来熟悉Linux编程环境,加强对Linux命令的理解及函数的运用。2.遇到的困难及解决的问题在程序设计过程中,遇到的困难主要有以下几个:一、系统函数调用问题;二、对文件的操作;三、复制文件。通过查阅Linuxc函数库后,知道了如何调用系统函数,并解决了对文件的操作;而文件的复制,则采用了如下思想:打开一个输入文件,创建一个输出文件,建立一个BUF大小的缓冲区;然后在判断输入文件未完的循环中,每次读入多少就向输出文件中写入多少,直到输入文件结束。二.概念原理1.基本概念为用户提供了输入命令和参数,以此向Linux内核发送请求以便运行程序的界面系统级程序。下图为Linux、UNIX系统层次结构图:2.原理解释用户输入的命令行,提交到系统内核处理,并将结果返回给用户。三.详细设计1.总体设计运行程序后,首先初始化,显示系统有的命令,然后通过用while(1)循环,连续的获取用户输入的命令,一直到用户输入quit退出循环,接着程序结束。2.主要函数及功能2.1intinit()显示系统命令等信息。intinit()//初始化{cout*****************欢迎使用GPLinux*********************endl;cout*系统命令*endl;cout*1.quit退出!*endl;cout*2.mypwd显示当前目录!*endl;cout*3.mycdir创建新目录!*endl;cout*4.mydir显示文件!*endl;cout*5.mycd改变路径!*endl;cout*6.mydel删除文件!*endl;cout*7.mydeldir删除目录!*endl;cout*8.mycp复制文件!*endl;cout*****************************************************endl;return0;}2.2intMyPwd()用于显示当前目录。intMyPwd()//显示当前目录{charb[255];getcwd(b,sizeof(b));//将当前的工作目录绝对路径复制到参数b中所指的内存空间coutbendl;return0;}2.3intMyCDir()用于创建新目录。intMyCDir()//创建新目录{if(strcmp(,param_list[1])==0){cout出错!请输入参数!endl;return-1;}if(mkdir(param_list[1],~0)==-1)//判断创建目录是否成功,并且可以修改权限{cout创建目录失败!endl;return-1;}else{cout创建目录成功!endl;}return0;}2.4intfn(constchar*file,conststructstat*sb,intflag)和intMyDir()用于从指定的目录开始,往下一层层地递归式遍历子目录和文件,然后输出到界面。intfn(constchar*file,conststructstat*sb,intflag)//第一参数指向当时所在的目录路径,第二参数为stat结构指针,第三个参数为旗标{if(flag==FTW_D)//FTW_D为目录{coutfile--目录endl;}if(flag==FTW_F)//FTW_F为一般文件{coutfile--文件endl;}return0;}intMyDir()//显示目录和文件{ftw(/home/,fn,500);//第一个参数为指定的开始目录,第二个参数为fn函数,第三个参数为进行遍历目录时可同时打开的文件数}2.5intMyCd()用于改变路径。intMyCd()//改变路径{if(strcmp(,param_list[1])==0){cout出错!请输入路径!endl;return-1;}if(chdir(param_list[1])==-1)//判断要改变的路径存不存在{cout目录不存在!endl;return-1;}return0;}2.6intMyDel()用于删除文件。intMyDel()//删除文件{if(strcmp(,param_list[1])==0){cout出错!请输入文件要删除的文件名!endl;return-1;}if(unlink(param_list[1])==-1)//判断文件删除是否成功{cout文件删除失败!endl;return-1;}else{cout文件删除成功!endl;}return0;}2.7intMyDelDir()用于删除文件夹。intMyDelDir()//删除文件夹{if(strcmp(,param_list[1])==0){cout出错!请输入要删除的目录!endl;return-1;}if(rmdir(param_list[1])==-1)//判断目录删除是否成功{cout目录删除失败!endl;return-1;}else{cout目录删除成功!endl;}return0;}2.8voidout(char*s1,char*s2)和intMyCp()用于复制文件,其中BUF用来表示缓冲区大小,CM用来定义创建文件的权限。voidout(char*s1,char*s2)//输出错误信息{coutstderrError:s1;perror(s2);coutendl;}intMyCp()//复制文件{intin_fd,out_fd,n_chars;//in_fd为输入文件描述符,out_fd为输出文件描述符,n_chars用于存放读出的字节数charbf[BUF];//缓冲区大小if((,param_list[1])==0){cout出错!请输入参数!endl;return-1;}if((in_fd=open(param_list[1],O_RDONLY))==-1)//只读方式打开文件{out(不能打开!,param_list[1]);}if((out_fd=creat(param_list[2],CM))==-1)//创建文件{out(不能创建文件!,param_list[2]);}while((n_chars=read(in_fd,bf,BUF))0){if(write(out_fd,bf,n_chars)!=n_chars){out(写入出错!,param_list[2]);}}if(n_chars==-1){out(读取失败!,param_list[1]);}if(close(in_fd)==-1||close(out_fd)==-1){out(关闭文件失败!,);}}2.9intgetCmd()用于命令的读取。intgetCmd()//命令的读取{chara;intj=0;while(scanf(%c,&a)!=EOF&&a!='\n'&&j256)//scanf(%c,&a)为在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符{cs[j]=a;j++;}cs[j]=0;return0;}2.10intPC()用户命令的解析。intPC()//命令的解析{unsignedinti=0,j=0,n=0;intbf=1;//分割符标志,表示有分割符,表示没有分割符for(i=0;istrlen(cs);i++){if(cs[i]==''||cs[i]=='\t'){if(bf==0){param_list[n][j]=0;n++;j=0;bf=1;}}else{param_list[n][j]=cs[i];j++;bf=0;}}if(bf==1){param_list[n][0]=0;//标识param_list的结束}else{param_list[n][j]=0;n++;param_list[n][0]=0;}return1;}2.11intZC()用于命令的执行。intZC()//命令的执行{if(strcmp(quit,param_list[0])==0)//退出{return-1;}if(strcmp(mypwd,param_list[0])==0)//显示当前目录{MyPwd();return0;}if(strcmp(mycdir,param_list[0])==0)//创建新目录{MyCDir();return0;}if(strcmp(mydir,param_list[0])==0)//显示文件{MyDir();return0;}if(strcmp(mycd,param_list[0])==0)//改变路径{MyCd();return0;}if(strcmp(mydel,param_list[0])==0)//删除文件{MyDel();return0;}if(strcmp(mydeldir,param_list[0])==0)//删除目录{MyDelDir();return0;}if(strcmp(mycp,param_list[0])==0)//复制文件{MyCp();return0;}return0;}2.12intmain(intargc,char*argv[])主函数,通过while(1)循环可以不断的输入命令。intmain(intargc,char*argv[]){init();while(1){coutGPLinux$;getCmd();PC();if(ZC()==-1){break;}}return0;}四.完成情况实现了列出文件、改变路径、复制文件、删除目录和示当前目录名的课程要求功能,并且还实现了删除文件和创建新目录功能。五.使用情况1.启动程序后,如下图所示:(可以看到系统有的命令和其用途)2.mypwd命令(无参数)3.mycdir命令命令格式为:mycdir目录名4.mydir命令(无参数)5.mycd命令命令格式为:mycd目录名6.mydel命令命令格式为:mydel文件名7.mydeldir命令命令格式为:mydeldir目录名8.mycp命令命令格式为:mycp源文件目的文件9.quit命令(无参数)六.设计总结1.经验教训通过本次课程设计,发现了自己很多的不足之处,比如对学过的知识还不能深刻的理解,而且还不能牢固的掌握。发现在程序设计中,可以使用系统自带的函数,这样可以节省时间和提高程序的稳定性。2.实践感受虽然在这次程序的设计过程中经历了很多的困难,但同时也学到了很多新的知识,如使我对Linux系统中的shell的运行机制有了进一步的了解;还重温了以前学过的知识。总的来说,每一次的课程设计都是让我们学到的知识进一步的加强,并且学会如何在遇到问题时,通过分析问题,到最后解决问题的思路。七.参考文献LinuxC函数库参考手册鸟哥的Linux私房菜:基础学习篇(第二版)Linux操作系统下C语言编程入门

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功