《操作系统课程设计说明书》参考样版_第1页
《操作系统课程设计说明书》参考样版_第2页
《操作系统课程设计说明书》参考样版_第3页
《操作系统课程设计说明书》参考样版_第4页
《操作系统课程设计说明书》参考样版_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

佛山科学技术学院课程设计用纸PAGE课程设计说明书设计名称:操作系统课程设计题目:操作系统命令接口设计 学生姓名:老志翔专业:计算机科学与技术班级:05级学号:305104534044指导教师:任朝晖日期:2010年9月16日

课程设计任务书计算机科学与技术专业05年级班老志翔设计题目操作系统命令接口设计主要内容利用C语言、DOS中断中21H与屏幕显示相关的中断调用完成设计,具体包括:命令解释器列目录命令显示时间命令显示日期命令回显字符串命令创建目录命令删除目录命令更改路径命令显示当前工作目录命令删除文件命令打印文本命令文件重新命名显示文本命令显示版本命令显示目录结构命令清除当前显示内容命令上述内容中,所有命令通过命令解释器能够执行,即启动命令解释器以后,输入相应命令,按照输入指令执行相应功能,并在屏幕上显示相应结果。具体要求本设计的目的是通过设计一些简单的操作系统的命令接口,使学生掌握操作系统接口的设计方法。要求学生在熟悉操作系统的命令接口及程序接口的基础上,利用C语言设计简单的命令接口。命令接口基于DOS的命令行接口。

进度安排依照教学计划,课程设计时间为:2周。要求讲解、资料查找、系统分析,概要设计(2天)系统详细设计、功能设计(2天)算法实现、编程调试(5天)功能演示、资料整理、课程设计说明书编写。(1天)完成后应上交的材料课程设计说明书纸质文档总评成绩指导教师签名日期年月日系主任审核日期年月日佛山科学技术学院课程设计用纸PAGE15佛山科学技术学院课程设计用纸目录TOC\o"1-3"\h\z一、程序概述 11.1完成的任务 11.2解决的问题 1二、概念原理 12.1基本概念 12.2基本原理 2三、总体设计 23.1实现方法 23.2技术路线 2四、详细设计 24.1主要函数 24.2引用函数 3五、完成情况 3六、使用说明 3七、设计总结 47.1系统特色 47.2经验教训 57.3实践感受 5参考资料 6附录 7PAGE1一、程序概述1.1完成的任务本设计是要求编写一个简单的命令解释器,利用C语言、DOS中断中21H与屏幕显示相关的中断调用进行设计的,主要完成要求中所提到的功能如:可打开提示符,并获取用户输入的指令、可解析指令、可寻找命令文件、可执行基本的命令。在本设计中,设计了一个dos命令提示行,初步实现了系统登陆、用户帐户管理、命令解析、基本命令的实现。1.2解决的问题在设计过程中主要遇到了两个难题,一个是有关文件的操作,另一个是有关系统调用问题。由于课题是要模拟命令处理器功能,命令处理器命令中有大部分是文件的操作,有关文件夹的创建与删除,文件的操作,当前目录等一系列问题都是有待解决的;并且由于本身做的就是一个命令处理器那么就不能再使用系统中原有的命令处理器命令,通过与老师讨论,可以使用系统调用解决这一问题。在查阅了库函数后基本确定了,可以使用包含在“doc.h”和“dir.h”中的findfirst()、findnext()、dir()、dir()完成以上功能,并且它们会将文件信息保存在一个Structffolk结构体中,定义如下:structffblk{charff_reserved[21];/*DOS保留字*/charff_attrib;/*文件属性*/intff_ftime;/*文件时间*/intff_fdate;/*文件日期*/longff_fsize;/*文件长度*/charff_name[13];/*文件名*/}二、概念原理2.1基本概念命令接口处理器命令处理器是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。它是一个交互性命令解释器。命令处理器独立于操作系统,这种设计让用户可以灵活选择适合自己的命令处理器。命令处理器让你在命令行键入命令,经过命令处理器解释后传送给操作系统(内核)执行。命令提示符“命令提示符”也就是Windows95/98下的“MS-DOS方式”,虽然随着计算机产业的发展,Windows操作系统的应用越来越广泛,DOS面临着被淘汰的命运,但是因为它运行安全、稳定,有的用户还在使用,所以一般Windows的各种版本都与其兼容,用户可以在Windows系统下运行DOS,中文版WindowsXP中的命令提示符进一步提高了与DOS下操作命令的兼容性,用户可以在命令提示符直接输入中文调用文件。消息循环通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。系统调用系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口,它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。2.2基本原理首先系统登陆,在这一块采用文件的形式保存用户信息。登陆通过后进入提示符界面,同时,此时已进入一个消息循环,不断地接收消息,根据输入的命令进行解析,然后执行命令,遇exit命令退出。基本流程图:开始开始系统登陆合法?获取命令解析命令处理命令结束三次?三、总体设计3.1实现方法程序主要通过文件来存储帐户信息。登陆时,根据用户名查找帐号名,核对密码。进入提示符后,首先初始化。在消息循环中运用了一个while(1)循环,连续的获取用户输入,直到用户输入exit退出循环,结束程序。在处理文件或文件夹过程中,没有使用系统当前文件夹变量,只是在程序中单独设定了一个变量作为系统当前目录,每次获得的目录路径,如果是相对路径,则自动在前面加上当前目录路径。3.2技术路线整个程序的设计流程,围绕着消息循环这一主线,根据消息判断调用不同的功能函数来完成相应的功能,主要使用了一些文件操作的函数。四、详细设计4.1主要函数voidinit()显示系统信息,版权信息等,初始化当前目录等信息。intlogin()显示登陆界面,以及登陆成功与否的判断与结果。正常登陆返回1。intgetcmd()命令获取函数,在消息循环中获取用户输入的命令,并将命令通过空格分隔开,分别存放在一个命令数组中。voiddir() 列出目录及文件voidcd() 改变当前文件夹voidclear() 清屏voidnewdir() 新建目录voiddeldir() 删除目录voiddel() 删除文件voidcopy() 复制文件voidcut() 剪切文件voidaccount() 更改用户信息以上均为一般的实现命令处理器功能的命令函数,可以通过相应的调用来实现一般的功能,也可以在其后面加入“/?”来获得帮助。voidhelp()帮助信息,当用户在提示符下直接输入“/?”或在一个命令处理器命令后输入“/?”转至此函数处,显示相关命令的帮助信息。4.2引用函数intchdir(char*path)使指定的目录path(如:“C:\\WPS”)变成当前的工作目录,成功返回Ointfindfirst(char*pathname,structffolk*ffolk,intattrib)查找指定的文件,成功返回0intfindnext(structffolk*ffolk)取匹配finddirst的文件,成功返回0intmkdir(char*pathname)建立一个新的目录pathname,成功返回Ointrmdir(char*pathname)删除一个目录pathname,成功返回0五、完成情况在用户登陆方面,完成了简单的,用户名和用户密码的保存更改,核对等操作,对密码文件采用的是记录式的读写。但是,本程序中并未实现记录的删除以及用户信息的加密。在命令处理机命令方面,基本实现了几个比较常用的命令,但参数还不够非富,并且对参数的输入,以及路径等的解析还不够智能化,输入命令时必输按固定的格式。在当前目录方面,没有使用系统调用中的设置当前目录的函数,而是自己定义了一个变量用于存入当前目录,每次操作文件或文件夹时,都要将相对目录转化为绝对目录才能进行操作。另外还有一个问题,就是命令对大小写敏感,这对于基于“Windows”平台的命令处理机是一大缺点。因为在命令解析中用了简单的字符串比较,所以对大小写敏感。六、使用说明启动程序,首先会出现下图所示的登陆界面,在Login后面输入用户名,在Password后面输入密码,如果用户名密码正确,那么进入系统,否则返回到登陆界面,如果连续输错三次,那么程序自动退出。进入系统后,首先出现版权信息等,然后就是出现提示符了如下图,用户可以输入“/?”查看当前系统支持的命令及作用等信息。如果想使用某个命令,那么可以先查看使用帮助,方法为:先在提示符后输入命令名,加空格后输入“/?”就会出现如下图所示的命令帮助提示,它会告诉用户可以使用哪些参数,各参数的作用等信息。在命令提示符下输入exit可以退出系统。七、设计总结7.1系统特色在本系统中已初步实现一个完整命令处理器的功能,能够正常的解析命令并执行,在解析命令方面,采用指针加数组的形式,既可以节约内存资源,又可以自动扩充命令参数。7.2经验教训在编程过程中要多使用库函数中自带的内容,不必另外再去编写已有的功能,这样不仅能节省时间,也能提高程序的可靠性。要多了解库函数,可以阅读相应的帮助文件来获得有用的信息。遇到问题多与老师同学讨论,可以帮助自己跳出思维定势。7.3实践感受每次的课程设计都是对我们所学知识的一个深化,在实践过程中能遇到许多的问题,遇到问题分析问题解决问题,这样对知识的理解得到一个升华。实践过程中学到的都是印象非常深刻的,所以以后要多参加这样的实践,认真对待每一次机会。

参考资料1、《计算机操作系统教程》(第2版)张尧学史美林编著清华大学出版社2、《操作系统实验指导》任爱华李鹏刘方毅清华大学出版社3、《操作系统实验教程——核心技术与编程实例》顾宝根王立松顾喜梅科学出版社4、《C++编程思想》 Bruck著侯捷译机械工业出版社5、《C语言程序中清除键盘缓冲区的方法》杨长虹益阳职业技术学院学报

附录#include<string.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<dir.h>#include<dos.h>#include<time.h>/*定义全局变量*/charroot_dir[3];charpre_dir[255];char*cmd_line[255];charcuruser[10];structuserinf{charusername[10];charuserpass[10];};/*函数申明*/voidinit();intlogin();intgetcmd();voiddir();voidcd();voidclear();voidnewdir();voiddeldir();voiddel();voidcopy();voidcut();voidaccount();voidhelp();main(){init();while(1)/*消息循环*/{switch(getcmd()){case0:help();break;case1:dir();break;case2:cd();break;case3:newdir();break;case4:deldir();break;case5:del();break;case6:copy();break;case7:cut();break;case8:account();break;}}}voidinit()/*程序初始化*/{if(login()==0){exit(0);}strcpy(pre_dir,"C:\\");/*设定当前目录*/clear();/*清屏*/printf("SShell-AboveWindowsXP[Ver1.0]\n");printf("(C)Copyright2007stars_625.\n\n");getchar();/*清空缓冲区*/}intlogin()/*程序登陆*/{charname[10];charpass[10];intlogintime=3;FILE*fp;structuserinfinf;while(logintime>0)/*登陆错误超过三次自动退出*/{printf("Login:");scanf("%s",name);printf("Password:");scanf("%s",pass);if((fp=fopen("inf.dll","r"))==NULL){printf("Can'topeninf.dllfile!\n");printf("Pressanykeytoexit...");getch();exit(0);}while(fread(&inf,sizeof(inf),1,fp)==1&&strcmp(inf.username,name)!=0){}fclose(fp);if(strcmp(inf.username,name)==0){if(strcmp(inf.userpass,pass)==0){strcpy(curuser,inf.username);clear();return1;}else{printf("Loginerror,Pressanykeytorelogin!\n");getch();clear();}}else{printf("Theuserisnotexist,Pressanykeytorelogin!\n");getch();clear();}logintime--;}printf("Loginerrorabovethreetimes,Pressanykeytoexit!");getch();return0;}intgetcmd()/*获得命令*/{inti=0,j=0,k=0;charbuf[255];printf("%s>",pre_dir);/*打印提示符*/fgets(buf,255,stdin);cmd_line[j]=calloc(255,sizeof(char));while(buf[i]!='\n'&&buf[i]!='\0')/*命令分析*/{if(buf[i]!=''){cmd_line[j][k]=buf[i];++k;}else{cmd_line[j+1]=calloc(255,sizeof(char));k=0;++j;}++i;}cmd_line[j+1]=0;if(strcmp(cmd_line[0],"exit")==0){exit(0);}elseif(strcmp(cmd_line[0],"/?")==0||strcmp(cmd_line[1],"/?")==0){return0;}elseif(strcmp(cmd_line[0],"dir")==0){return1;}elseif(strcmp(cmd_line[0],"cd")==0){return2;}elseif(strcmp(cmd_line[0],"newdir")==0){return3;}elseif(strcmp(cmd_line[0],"deldir")==0){return4;}elseif(strcmp(cmd_line[0],"del")==0){return5;}elseif(strcmp(cmd_line[0],"copy")==0){return6;}elseif(strcmp(cmd_line[0],"cut")==0){return7;}elseif(strcmp(cmd_line[0],"account")==0){return8;}elseif(cmd_line[0][1]==':'){strcpy(pre_dir,cmd_line[0]);strcat(pre_dir,"\\");}elseif(strcmp(cmd_line[0],"clear")==0){clear();}else{printf("Thecommandisnotsupported!\n");}}voiddir()/*列出文件及文件夹*/{structffblkff;charfilepath[255];strcpy(filepath,pre_dir);findfirst(strcat(filepath,"*.*"),&ff,FA_DIREC);if(ff.ff_attrib==16){printf("<DIR>\t");}else{printf("\t");}printf("%s\n",ff.ff_name);while(findnext(&ff)==0){if(ff.ff_attrib==16){printf("<DIR>\t");}else{printf("\t");}printf("%s\n",ff.ff_name);}}voidcd()/*改变当前目录*/{inti=0;structffblkff;charfilepath[255];strcpy(filepath,pre_dir);if(strcmp(cmd_line[1],"..")==0)/*返回上一层目录*/{while(filepath[i]!='\0'){i++;}if(filepath[i-2]!=':'){i=i-2;while(filepath[i]!='\\'&&i>=2){i--;}filepath[i+1]='\0';strcpy(pre_dir,filepath);}}elseif(strcmp(cmd_line[1],"\\")==0)/*返回根目录*/{while(filepath[i]!='\\'){i++;}filepath[i+1]='\0';strcpy(pre_dir,filepath);}else{findfirst(strcat(filepath,"*.*"),&ff,FA_DIREC);while(strcmp(ff.ff_name,cmd_line[1])!=0){if(findnext(&ff)!=0){break;}}if(strcmp(ff.ff_name,cmd_line[1])==0){strcat(pre_dir,cmd_line[1]);strcat(pre_dir,"\\");}else{printf("Can'tfindthefile!\n");}}voidclear(){clrscr();}voidnewdir(){charfilepath[255];strcpy(filepath,pre_dir);if(mkdir(strcat(filepath,cmd_line[1]))==0){printf("Makedir'%s'successfully!\n",cmd_line[1]);}else{printf("Makedirerror!\n");}}voiddeldir(){charfilepath[255];strcpy(filepath,pre_dir);if(rmdir(strcat(filepath,cmd_line[1]))==0){printf("Deletedir'%s'successfully!\n",cmd_line[1]);}else{printf("Deletedirerror!\n");}}voiddel(){charfilepath[255];strcpy(filepath,pre_dir);if(unlink(strcat(filepath,cmd_line[1]))==0){printf("Delete%ssuccessfully!\n",cmd_line[1]);}else{printf("Deleteerror!\n");}}voidcopy(){charfilepath[255];charsourcepath[255];charaimpath[255];FILE*newfp;FILE*oldfp;charch;strcpy(filepath,pre_dir);if(cmd_line[1][1]!=':'){strcpy(sourcepath,filepath);strcat(sourcepath,cmd_line[1]);}else{strcpy(sourcepath,cmd_line[1]);}if(cmd_line[2][1]!=':'){strcpy(aimpath,filepath);strcat(aimpath,cmd_line[2]);}else{strcpy(aimpath,cmd_line[2]);}if((oldfp=fopen(sourcepath,"r"))==NULL){printf("Can'topenoldfile!\n");}if((newfp=fopen(aimpath,"w"))==NULL){printf("Can'tcreatnewfile!\n");}while((ch=fgetc(oldfp))!=EOF){fputc(ch,newfp);}fclose(oldfp);fclose(newfp);printf("Copyfrom%sto%ssuccessfully!\n",sourcepath,aimpath);}voidcut(){charfilepath[255];charsourcepath[255];charaimpath[255];FILE*newfp;FILE*oldfp;charch;strcpy(filepath,pre_dir);if(cmd_line[1][1]!=':'){strcpy(sourcepath,filepath);strcat(sourcepath,cmd_line[1]);}else{strcpy(sourcepath,cmd_line[1]);}if(cmd_line[2][1]!=':'){strcpy(aimpath,filepath);strcat(aimpath,cmd_line[2]);}else{strcpy(aimpath,cmd_line[2]);}if((oldfp=fopen(sourcepath,"r"))==NULL){printf("Can'topenoldfile!\n");}if((newfp=fopen(aimpath,"w"))==NULL){printf("Can'tcreatnewfile!\n");}while((ch=fgetc(oldfp))!=EOF){fputc(ch,newfp);}fclose(oldfp);fclose(newfp);if(unlink(sourcepath)==0){printf("Cutfrom%sto%ssuccessfully!\n",sourcepath,aimpath);}else{printf("Deleteoldfileerror!\n");}}voidaccount(){FILE*fp;structuserinfinf;if(strcmp(cmd_line[1],"/add")==0){if((fp=fopen("inf.dll","r+"))==NULL){printf("Can'topeninf.dllfile!\n");printf("Pressanykeytoexit...");getch();}while(fread(&inf,sizeof(inf),1,fp)==1&&strcmp(inf.username,cmd_line[2])!=0){}if(strcmp(inf.username,cmd_line[2])==0){printf("Createusererror,theuserisexist!\n");}else{strcpy(inf.username,cmd_line[2]);strcpy(inf.userpass,cmd_line[3]);if(fwrite(&inf,sizeof(inf),1,fp)==1){printf("Createuser%ssuccessfully!\n",inf.username);}else{printf("Createusererror!\n");}}fclose(fp);}elseif(strcmp(cmd_line[1],"/edit")==0){if((fp=fopen("inf.dll","r+"))==NULL){printf("Can'topeninf.dllfile!\n");printf("Pressanykeytoexit...");getch();}while(fread(&inf,sizeof(inf),1,fp)==1&&strcmp(inf.username,cmd_line[2])!=0){}if(strcmp(inf.username,cmd_line[2])!=0){printf("Editusererror,theuserisnotexist!\n");}else{strcpy(inf.username,cmd_line[2]);strcpy(inf.userpass,cmd_line[3]);fseek(fp,-20L,1);if(fwrite(&inf,sizeof(inf),1,fp)==1){printf("Edituser%ssuccessfully!\n",inf.username);}else{printf("Editusererror!\n");}}fclose(fp);}else{printf("Pleaseentercorrectparameter,type/?forhelp!\n");}}voidhelp(){if(strcmp(cmd_line[0],"/?")==0){printf("Thelistofcommands.\n\n");printf("dir\t\tListthefilesanddirs.\n");printf("cd\t\tChangethedir.\n");printf("clear\t\tClearthescreen.\n");printf("newdir\tMakeadir.\n");printf("deldir\tDeleteadir.\n");printf("del\t\tDeleteafile.\n");printf("copy\t\tCopyafilefromaplacetoanother.\n");printf("cut\t\tCutafilefromaplacetoanother.\n");printf("account\tAddeditordeleteaaccount.\n\n");printf("Formoreinformationaddtype/?aftercommand.\n\n");printf("Notice:Allthecommandlineiscapitalizationdistinction!\n\n");}else{if(strcmp(cmd_line[0],"dir")==0){printf("Listthefilesanddirs.\n\n");printf("dirpath\n\n");printf("path\t\tThediryouwanttolist.\n");printf("\t\tifpathisNULLthenlistthecurrentdir.\n\n");}elseif(strcmp(cmd_line[0],"cd")==0){printf("Changethedir.\n\n");printf("cd<\\|..|path>\n\n");printf("\\\t\tReturntotherootdir.\n");printf("..\t\tReturntotheparentdir.\n");printf("path\t\tThediryouwantchangeto.\n\n");}els

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论