《操作系统课程设计说明书》参考样版.docx
《《操作系统课程设计说明书》参考样版.docx》由会员分享,可在线阅读,更多相关《《操作系统课程设计说明书》参考样版.docx(33页珍藏版)》请在冰豆网上搜索。
《操作系统课程设计说明书》参考样版
课程设计说明书
设计名称:
操作系统课程设计
题目:
操作系统命令接口设计
学生姓名:
老志翔
专业:
计算机科学与技术
班级:
05级
学号:
305104534044
指导教师:
任朝晖
日期:
2010年9月16日
课程设计任务书
计算机科学与技术专业05年级班老志翔
一、设计题目
操作系统命令接口设计
二、主要内容
利用C语言、DOS中断中21H与屏幕显示相关的中断调用完成设计,具体包括:
1、命令解释器
2、列目录命令
3、显示时间命令
4、显示日期命令
5、回显字符串命令
6、创建目录命令
7、删除目录命令
8、更改路径命令
9、显示当前工作目录命令
10、删除文件命令
11、打印文本命令
12、文件重新命名
13、显示文本命令
14、显示版本命令
15、显示目录结构命令
16、清除当前显示内容命令
上述内容中,所有命令通过命令解释器能够执行,即启动命令解释器以后,输入相应命令,按照输入指令执行相应功能,并在屏幕上显示相应结果。
三、具体要求
本设计的目的是通过设计一些简单的操作系统的命令接口,使学生掌握操作系统接口的设计方法。
要求学生在熟悉操作系统的命令接口及程序接口的基础上,利用C语言设计简单的命令接口。
命令接口基于DOS的命令行接口。
四、
进度安排
依照教学计划,课程设计时间为:
2周。
1.要求讲解、资料查找、系统分析,概要设计(2天)
2.系统详细设计、功能设计(2天)
3.算法实现、编程调试(5天)
4.功能演示、资料整理、课程设计说明书编写。
(1天)
五、完成后应上交的材料
课程设计说明书纸质文档
六、总评成绩
指导教师 签名日期 年 月 日
系主任 审核日期 年 月 日
目 录
一、程序概述1
1.1完成的任务1
1.2解决的问题1
二、概念原理1
2.1基本概念1
2.2基本原理2
三、总体设计2
3.1实现方法2
3.2技术路线2
四、详细设计2
4.1主要函数2
4.2引用函数3
五、完成情况3
六、使用说明3
七、设计总结4
7.1系统特色4
7.2经验教训5
7.3实践感受5
参考资料6
附录7
一、程序概述
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”)变成当前的工作目录,成功返回O
intfindfirst(char*pathname,structffolk*ffolk,intattrib)
查找指定的文件,成功返回0
intfindnext(structffolk*ffolk)
取匹配finddirst的文件,成功返回0
intmkdir(char*pathname)
建立一个新的目录pathname,成功返回O
intrmdir(char*pathname)
删除一个目录pathname,成功返回0
五、完成情况
在用户登陆方面,完成了简单的,用户名和用户密码的保存更改,核对等操作,对密码文件采用的是记录式的读写。
但是,本程序中并未实现记录的删除以及用户信息的加密。
在命令处理机命令方面,基本实现了几个比较常用的命令,但参数还不够非富,并且对参数的输入,以及路径等的解析还不够智能化,输入命令时必输按固定的格式。
在当前目录方面,没有使用系统调用中的设置当前目录的函数,而是自己定义了一个变量用于存入当前目录,每次操作文件或文件夹时,都要将相对目录转化为绝对目录才能进行操作。
另外还有一个问题,就是命令对大小写敏感,这对于基于“Windows”平台的命令处理机是一大缺点。
因为在命令解析中用了简单的字符串比较,所以对大小写敏感。
六、使用说明
启动程序,首先会出现下图所示的登陆界面,在Login后面输入用户名,在Password后面输入密码,如果用户名密码正确,那么进入系统,否则返回到登陆界面,如果连续输错三次,那么程序自动退出。
进入系统后,首先出现版权信息等,然后就是出现提示符了如下图,用户可以输入“/?
”查看当前系统支持的命令及作用等信息。
如果想使用某个命令,那么可以先查看使用帮助,方法为:
先在提示符后输入命令名,加空格后输入“/?
”就会出现如下图所示的命令帮助提示,它会告诉用户可以使用哪些参数,各参数的作用等信息。
在命令提示符下输入exit可以退出系统。
七、设计总结
7.1系统特色
在本系统中已初步实现一个完整命令处理器的功能,能够正常的解析命令并执行,在解析命令方面,采用指针加数组的形式,既可以节约内存资源,又可以自动扩充命令参数。
7.2经验教训
在编程过程中要多使用库函数中自带的内容,不必另外再去编写已有的功能,这样不仅能节省时间,也能提高程序的可靠性。
要多了解库函数,可以阅读相应的帮助文件来获得有用的信息。
遇到问题多与老师同学讨论,可以帮助自己跳出思维定势。
7.3实践感受
每次的课程设计都是对我们所学知识的一个深化,在实践过程中能遇到许多的问题,遇到问题分析问题解决问题,这样对知识的理解得到一个升华。
实践过程中学到的都是印象非常深刻的,所以以后要多参加这样的实践,认真对待每一次机会。
参考资料
1、《计算机操作系统教程》(第2版)张尧学史美林编著清华大学出版社
2、《操作系统实验指导》任爱华李鹏刘方毅清华大学出版社
3、《操作系统实验教程——核心技术与编程实例》顾宝根王立松顾喜梅科学出版社
4、《C++编程思想》Bruck著侯捷译机械工业出版社
5、《C语言程序中清除键盘缓冲区的方法》杨长虹益阳职业技术学院学报
附录
#include
#include
#include
#include
#include
#include
#include
/*定义全局变量*/
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("
\t");}
else
{
printf("\t");
}
printf("%s\n",ff.ff_name);
while(findnext(&ff)==0)
{
if(ff.ff_attrib==16)
{
printf("
\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");
}
}