操作系统shell命令解析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.程序概述
1.完成的任务
在Linux环境下编写一个简单的命令解释器即定义一个命令使它具有Linux中某些
命令的功能,可以实现获取用户输入的指令、可解析指令、可执行命令等功能,以
此来熟悉Linux编程环境,加强对Linux命令的理解及函数的运用。
2.遇到的困难及解决的问题
在程序设计过程中,遇到的困难主要有以下几个:一、系统函数调用问题;二、对
文件的操作;三、复制文件。
通过查阅Linux c函数库后,知道了如何调用系统函数,并解决了对文件的操作;而
文件的复制,则采用了如下思想:打开一个输入文件,创建一个输出文件,建立一
个BUF大小的缓冲区;然后在判断输入文件未完的循环中,每次读入多少就向输出
文件中写入多少,直到输入文件结束。
二.概念原理
1.基本概念
为用户提供了输入命令和参数,以此向Linux内核发送请求以便运行程序的界面系
统级程序。下图为Linux、UNIX系统层次结构图:
2.原理
解释用户输入的命令行,提交到系统内核处理,并将结果返回给用户。
三.详细设计
1.总体设计
运行程序后,首先初始化,显示系统有的命令,然后通过用while(1)循环,连续的
获取用户输入的命令,一直到用户输入quit退出循环,接着程序结束。
2.主要函数及功能
2.1 int init()
显示系统命令等信息。
int init()//初始化
{
cout<<"*****************欢迎使用GPLinux*********************"< cout<<"* 系统命令 *"< cout<<"* 1.quit 退出! *"< cout<<"* 2.mypwd 显示当前目录! *"< cout<<"* 3.mycdir 创建新目录! *"< cout<<"* 4.mydir 显示文件! *"< cout<<"* 5.mycd 改变路径! *"< cout<<"* 6.mydel 删除文件! *"< cout<<"* 7.mydeldir 删除目录! *"< cout<<"* 8.mycp 复制文件! *"< cout<<"*****************************************************"< return 0; } 2.2 int MyPwd() 用于显示当前目录。 int MyPwd()//显示当前目录 { char b[255]; getcwd(b, sizeof(b)); //将当前的工作目录绝对路径复制到参数b中所指的内存空间 cout< return 0; } 2.3 int MyCDir() 用于创建新目录。 int MyCDir()//创建新目录 { if(strcmp("", param_list[1]) == 0) { cout<<"出错!请输入参数!"< return -1; } if(mkdir(param_list[1], ~0) == -1) //判断创建目录是否成功,并且可以修改权限 { cout<<"创建目录失败!"< return -1; } else { cout<<"创建目录成功!"< } return 0; } 2.4 int fn(const char * file, const struct stat * sb, int flag)和int MyDir() 用于从指定的目录开始,往下一层层地递归式遍历子目录和文件,然后输出到界面。 int fn(const char * file, const struct stat * sb, int flag) //第一参数指向当时所在的目录路径,第二参数为stat结构指针,第三个参数为旗标 { if(flag == FTW_D) //FTW_D为目录 { cout< } if(flag == FTW_F) //FTW_F为一般文件 { cout< } return 0; } int MyDir()//显示目录和文件 { ftw("/home/", fn, 500); //第一个参数为指定的开始目录,第二个参数为fn函数,第三个参数为进行遍历目录时可同时打开的文件数 } 2.5 int MyCd() 用于改变路径。 int MyCd()//改变路径 { if(strcmp("", param_list[1]) == 0) { cout<<"出错!请输入路径!"< return -1; } if(chdir(param_list[1]) == -1) //判断要改变的路径存不存在 { cout<<"目录不存在!"< return -1; } return 0; } 2.6 int MyDel() 用于删除文件。 int MyDel()//删除文件 { if(strcmp("", param_list[1]) == 0) { cout<<"出错!请输入文件要删除的文件名!"<