2022年模拟shell功能 .pdf
齐齐哈尔大学操作系统课程综合实践题目: 命令解释器模拟shell 功能班级:0姓名:0学号:0指导教师:02011 年 12 月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 综合实践评分表班级0 姓名0 指导教师0 题目:命令解释器模拟shell 功能评分标准评分标准分数权重评分的依据得分A C 选题10 选题符合大纲要求, 题目较新颖,工作量大选题基本符合大纲要求,工作量适中工作态度10 态度端正,能主动认真完成各个环节的工作,不迟到早退,出勤好。能够完成各环节基本工作,出勤较好。存储结构、算法描述20 能正确选择存储结构,定义准确,算法流程图或类 C 语言描述的算法准确无误能正确选择存储结构,算法流程图或类C 语言描述的算法基本准确独立解决问题的能力10 具有独立分析、 解决问题能力,有一定的创造性,能够独立完成软件的设计与调试工作, 程序结构清晰,逻辑严谨,功能完善。有一定的分析、 解决问题能力。能够在老师指导下完成软件的设计与调试工作,程序功能较完善。答辨问题回答20 能准确回答老师提出的问题能基本准确回答老师提出的问题程序运行情况10 程序运行正确、 界面清晰,测试数据设计合理。程序运行正确、 界面较清晰,能给出合适的测试数据。综合实践报告20 格式规范,层次清晰,设计思想明确, 解决问题方法合理,体会深刻。格式较规范,设计思想基本明确,解决问题方法较合理。总分指导教师(签字):注:介于 A 和 C 之间为 B 级,低于 C 为 D 级和 E 级。按各项指标打分后,总分在 90100 为优,8089 为良,7079 为中,6069 为及格,60 分以下为不及格。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 命令解释器模拟 shell 功能摘要: Shell 是最重要的实用程序,深入了解和熟练掌握shell 的特性极其使用方法,是用好Linux 系统的关键。作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux 系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。关键词: 解释器 shell编程1. 完成的任务本设计是按照 操作系统综合实践任务书 里课题十五、 编写一个简单的命令解释器模拟 shell 功能来进行设计的, 主要完成要求中所提到的功能如:可打开提示符,并获取用户输入的指令、可解析指令、可寻找命令文件、可执行基本的命令。在本设计中,设计了一个 S_shell ,初步实现了系统登陆、用户帐户管理、命令解析、基本命令的实现。2. 解决的问题在设计过程中主要遇到了两个难题,一个是有关文件的操作, 另一个是有关系统调用问题。 由于课题是要模拟 shell 功能,shell 命令中有大部分是文件的操作,有关文件夹的创建与删除, 文件的操作, 当前目录等一系列问题都是有待解决的 ; 并且由于本身做的就是一个shell 那么就不能再使用系统中原有的shell 命令,通过与老师讨论, 可以使用系统调用解决这一问题。在查阅了库函数后基本确定了,可以使用包含在“doc.h ”和“ dir.h ”中的 findfirst()、findnext()、mkdir() 、rmdir() 等函数来完成以上功能, 并且它们会将文件信息保存在一个 struct ffblk 结构体中,定义如下:struct ffblk char ff_reserved21; /*DOS 保留字 */ char ff_attrib; /*文件属性 */ int ff_ftime; /*文件时间 */ int ff_fdate; /*文件日期 */ long ff_fsize; /*文件长度 */ char ff_name13; /*文件名 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 一、概念原理1. 基本概念shell shell 是一个命令处理器( command processor)是一个读入并解释你输入的命令的程序, 它是介于使用者和操作系统之核心程序(kernel )间的一个接口。它是一个交互性命令解释器。shell 独立于操作系统, 这种设计让用户可以灵活选择适合自己的 shell 。shell 让你在命令行键入命令,经过shell 解释后传送给操作系统(内核)执行。命令提示符“命令提示符”也就是 Windows 95/98 下的“ MS-DOS 方式”,虽然随着计算机产业的发展, Windows 操作系统的应用越来越广泛, DOS 面临着被淘汰的命运,但是因为它运行安全、稳定,有的用户还在使用,所以一般Windows 的各种版本都与其兼容,用户可以在Windows 系统下运行 DOS ,中文版 Windows XP 中的命令提示符进一步提高了与DOS 下操作命令的兼容性,用户可以在命令提示符直接输入中文调用文件。消息循环通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。系统调用系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口它好比一个中间人, 把用户进程的请求传达给内核, 待内核把请求处理完毕后再将处理结果送回给用户空间。2. 基本原理首先系统登陆, 在这一块采用文件的形式保存用户信息。登陆通过后进入提示符界面,同时,此时已进入一个消息循环,不断地接收消息,根据输入的命令进行解析,然后执行命令,遇exit 命令退出。基本流程图:见图一名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 开始系统登陆合法三次 ?获取命令解析命令处理命令结束YN图 一二、总体设计1. 实现方法程序主要通过文件来存储帐户信息。登陆时,根据用户名查找帐号名, 核对密码。进入提示符后,首先初始化。在消息循环中运用了一个while (1)循环,连续的获取用户输入,直到用户输入exit 退出循环,结束程序。在处理文件或文件夹过程中, 没有使用系统当前文件夹变量, 只是在程序中单独设定了一个变量作为系统当前目录, 每次获得的目录路径, 如果是相对路径,则自动在前面加上当前目录路径。2. 技术路线整个程序的设计流程, 围绕着消息循环这一主线, 根据消息判断调用不同的功能函数来完成相应的功能,主要使用了一些文件操作的函数。三、详细设计1. 主要函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - void init() 显示系统信息,版权信息等,初始化当前目录等信息。int login() 显示登陆界面,以及登陆成功与否的判断与结果。正常登陆返回1。int getcmd() 命令获取函数,在消息循环中获取用户输入的命令,并将命令通过空格分隔开,分别存放在一个命令数组中。void dir() 列出目录及文件void cd() 改变当前文件夹void clear() 清屏void newdir() 新建目录void deldir() 删除目录void del() 删除文件void copy() 复制文件void cut() 剪切文件void account() 更改改户信息以上均为一般的实现 shell 功能的命令函数,可以通过相应的调用来实现一般的功能,也可以在其后面加入“/? ”来获得帮助。void help() 帮助信息,当用户在提示符下直接输入“/? ”或在一个 shell 命令后输入“/? ”转至此函数处,显示相关命令的帮助信息。2. 引用函数int chdir(char *path) 使指定的目录 path (如:C:WPS )变成当前的工作目录 , 成功返回 0 int findfirst(char *pathname,struct ffblk *ffblk,int attrib) 查找指定的文件 , 成功返回 0 int findnext(struct ffblk *ffblk) 取匹配 finddirst 的文件 , 成功返回 0 int mkdir(char *pathname) 建立一个新的目录 pathname,成功返回 0 int rmdir(char *pathname) 删除一个目录 pathname,成功返回 0 3. 声明名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - #include #include #include #include #include #include #include /* 定义全局变量 */ char root_dir3; char pre_dir255; char *cmd_line255; char curuser10; struct userinf char username10; char userpass10; ; /* 函数申明 */ void init(); int login(); int getcmd(); void dir(); void cd(); void clear(); void newdir(); void deldir(); void del(); void copy(); void cut(); 4. 主函数部分void account(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - void help(); main() init(); while(1)/* 消息循环 */ switch(getcmd() case 0: help(); break; case 1: dir(); break; case 2: cd(); break; case 3: newdir(); break; case 4: deldir(); break; case 5: del(); break; case 6: copy(); break; case 7: cut(); break; case 8: account(); break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 四、完成情况在用户登陆方面, 完成了简单的, 用户名和用户密码的保存更改,核对等操作,对密码文件采用的是记录式的读写。但是,本程序中并未实现记录的删除以及用户信息的加密。在shell 命令方面,基本实现了几个比较常用的命令,但参数还不够非富,并且,对参数的输入, 以及路径等的解析还不够智能化,输入命令时必输按固定的格式。在当前目录方面, 没有使用系统调用中的设置当前目录的函数,而是自己定义了一个变量用于存入当前目录,每次操作文件或文件夹时, 都要将相对目录转化为绝对目录才能进行操作。另外还有一个问题,就是命令对大小写敏感,这对于基于“Windows ”平台的shell 是一大缺点。因为在命令解析中用了简单的字符串比较,所以对大小写敏感。五、使用说明启动程序,首先会出现下图所示的登陆界面,在Login 后面输入用户名, 在Password 后面输入密码,如果用户名密码正确,那么进入系统,否则返回到登陆界面,如果连续输错三次,那么程序自动退出。见图二Login :admin Passw :admin888 图二登陆名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 进入系统后,首先出现版权信息等,然后就是出现提示符了如下图,用户可以输入“ /? ”查看当前系统支持的命令及作用等信息。见图三图三登陆后界面如果想使用某个命令,那么可以先查看使用帮助,方法为:先在提示符后输入命令名,加空格后输入“ /? ”就会出现如下图所示的命令帮助提示,它会告诉用户可以使用哪些参数,各参数的作用等信息。见图四图四帮助在命令提示符下输入 exit 可以退出系统。六、设计总结1. 系统特色在本系统中已初步实现一个完整shell 的功能,能够正常的解析命令并执行,在解析命令方面,采用指针加数组的形式,既可以节约内存资源,又可以自动扩充命令参数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 2. 经验教训在编程过程中要多使用库函数中自带的内容,不必另外再去编写已有的功能,这样不仅能节省时间,也能提高程序的可靠性。要多了解库函数,可以阅读相应的帮助文件来获得有用的信息。遇到问题多与老师同学讨论, 可以帮助自己跳出思维定势。shell 语言与其他编程语言相比真正有说服力的优势在于上面提到的第一点。Shell 提供把进程和文件连接在一起的强力的记法。在这个角度上,shell 语言非常适合作为 Unix 操作系统的一般性范例。 在 Unix 中,基本的计算代理 (agent) 是程序,它作为在单独的地址空间中的进程而运行。通过在叫做管道的有向字节流上通信, 这些代理协同并相互交流来解决问题。在这个层次上看,Unix 是一个数据流体系。在这个角度上,shell 担任了关键角色,这门语言设计用来把单独的计算代理结合起来解决一个特定问题。3. 实践感受每次的课程设计都是对我们所学知识的一个深化,在实践过程中能遇到许多的问题,遇到问题 -分析问题 -解决问题, 这样对知识的理解得到一个升华。实践过程中学到的都是印象非常深刻的,所以以后要多参加这样的实践, 认真对待每一次机会。 通过对现代操作系统 的学习,我将用命令分割得到命令和参数,通过fork()函数创建子进程调用 exec系统函数,并自己编写无法用 exec系统函数执行的命令函数, 依次完成打开提示符, 获取用户输入的指令可解析指令、可寻找命令文件、 可执行基本的命令的功能。 通过这个从简到繁, 逐步扩展的过程基本程序才得以完成, 通过发现问题解决问题的过程,程序才得以逐步完善。 里面融合这我每一点的创新观念。 经过测试已经证明本程序有很强的功能和很好的性能,但是仔细观察模拟 shell 和真实 shell 的区别还是可以发现。 比如说文字变色功能,在 shell 中,浏览目录时文本和文件夹名称显示颜色不同,vi 编辑器中,输入C语言的关键字等会自动变色提示。而在模拟shell 中,所有输出均为黑色。又如在真实 shell 中,存在很多快捷键,像向上向下键可以重复已经输入过的命令,向左向右键可以移动光标,而在模拟shell 中,摁这些键则会认定为是录入字符。这些证明真实的 shell 功能是更复杂更完善的,我的程序还有很多需要改进的地方,以后要继续学习,继续完善。参考文献: 1 杨长虹.C 语言程序中清楚键盘缓冲区的方法J.2006.(04) 2 王姝阳,庞丽萍等 .Linux系统调用的实现技术 J.小型微型计算机系统 .1999(12). 3杨向东 .Shell语言使用技巧实例 J.中国金融电脑 .2006. (06)4 滕艳平等 . 计算机操作系统 . 哈尔滨工业大学出版社 .2008 年 9月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -