操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(66页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
计算机系课程设计
实验报告
课程名称操作系统课程设计
实验学期2012至2013学年第1学期
学生所在系部计算机与信息管理系
年级2010专业班级计算机002
学生姓名牛子
学号100000
任课教师
实验成绩
计算机系制
一个简单的文件系统的详细设计
一、实验目的
(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求
1、阅读所给文件系统源程序,并加注释(注释量达60%),
2、修改、完善该系统,画出所设计的文件系统的详细流程图。
三、文件系统功能设计
1.功能设计
该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:
①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:
bye
②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:
close
③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:
create>file1
其中:
“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:
delete>file1
其中:
file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
命令格式:
list
⑥chmod——改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。
命令格式:
chmod>file1。
其中:
file1为要授权的文件名。
⑦open——在window界面下打开某个文件。
执行该命令后,文件file1将用在windows界面下的文件形式打开。
用户可以在这个方式中对文件进行修改,并将修改后的内容保存。
命令格式:
open>file1
其中:
file1为要打开的文件名。
⑧read——读文件信息。
将文件信息读入并显示在终端上。
命令格式:
read>file1
其中:
file1为要读的文件名。
⑨write——向某个文件写入新的信息。
用户可以选择用覆盖原来内容的方式或和在文件的末尾追加新信息的方式写入信息。
当要退出时输入“#”即可。
(2)系统采用二级文件目录。
设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。
在主目录中有注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。
用户文件目录采用用户名作为文件名保存于磁盘,以便检索时方便对应。
在用户文件目录中保存着该目录下所有文件的文件名称、保护码、文件长度。
(3)该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建、写入、读出、删除等效果。
2.功能设计实现总体流程
3.主要数据结构
4.主要功能模块
四、文件系统功能模块详细设计流程图
1.intLoginDisplay()//登陆选项操作函数
2.boolLogin(intSELETE)//用户登陆,注册函数
3.voidDisplayUFD()//打印用户信息,包括用户的各个文件
4.voidByeFile(boolBOOL)//注销函数,调用次函数用户可以退出系统
5.boolClearUserFile()//用户要将自己的注册目录从系统彻底删除
6.voidClearUserMes()//删除用户全部信息
7.voidDeleteUser()//删除用户注册目录的操作
8.voidCreatFile()//在当前用户目录下创建文件
9.voidDeleteFile()//删除当前目录下一个文件的操作
10.boolQueryModElse(boolBOOL,bool&flag)//查询其它用户目录下文件的文件
11.boolQueryMod(boolBOOL)//查询权限
12.boolWriteRight(intlen,boolBOOL)//查看是否已经正确地写入到该文件信息中,是则返回真值
13.voidWriteLengthToFile(intLen,boolBOOL)//将文件长度写入文件管理模块中
14.voidWriteFile()//向文件写入信息的操作
15.
voidReadFile()//读文件函数
答:
16.voidChangeMod()//修改某文件的执行权限
答:
17.voidExecute(inti,intlen,intcmdset)//执行命令函数
答:
18.voidCommand()//读取用户输入的命令,并将其转换成系统能识别的命令
五、实验运行结果
1.登陆界面
2.用户注册
3.用户登陆
4.创建用户文件
5.显示当前注册用户目录下的所有文件信息
6.在windows界面下打开文件
7.向文件中写入信息
(1)以覆盖的模式写入
(2)在原文件末尾写入
7.读取文件信息
8.改变该文件的权限
修改读权限后
另一用户yinhuanwen读取该文件显示为
其他用户无法读取改文件
9.删除当前用户下的一个文件
10.删除用户信息
11.注销用户,返回登陆界面
六、系统改进的设想与实现
1、修改内容说明
(1)用户注销功能无法正常实现,缺少调用函数。
(2)系统完善补充:
(3)漏洞补充
2、实现程序(用小六字体打印)。
修改了不对称的花括号;
修改前:
case1:
//退出
ByeFile(true);
system("cls");
修改后:
case1:
//退出
ByeFile(true);
while
(1){
intSELETE=LoginDisplay();//用户登录选项函数
if(SELETE==0)//如果用户输入命令是0则,退出系统
exit(0);
boolBOOL=Login(SELETE);//用户登陆,或者注册函数
if(BOOL)
{
KeyWord();//初始化命令关键字
DisplayUFD();//打印用户目录下的文件目录
Command();//命令行操作
}
}
注:
Command函数需要在开头声明。
(2)修改前:
do
{
cout<<"*****请选择操作*****\n1、用户登陆2、用户注册0、退出"<cin>>SELETE_1;
}while(SELETE_1<0||SELETE_1>2);
修改后:
do
{
cout<<"*****请选择操作*****\n1、用户登陆2、用户注册0、退出"<cin>>SELETE_1;
if(SELETE_1<0||SELETE_1>2){
cout<<"请输入0-2之间的数字!
"<}
}while(SELETE_1<0||SELETE_1>2);
七、实验成绩
成绩分配:
1.实验报告:
共60分(内容正确40分,流程图规范20分),发现雷同,抄者和被抄者一律都不给分。
2.实验检查:
共40分(抽答2题,每题10分,改进20分)。
3.两人一组,彼此要了解对方的内容。
成绩不及格者给一次补的机会。
详细程序:
w/*****************************************************************
*文件名:
Simple_file_system.c
*功能:
简单文件管理系统模拟程序
*******************************************************************/
#include
#include
#include
#include
#include"conio.h"
#include
#defineNULL0
#definekeynum10
#definegetspace(type)(type*)malloc(sizeof(type))
charcmd[64];//存放用户输入命令
charbuffer[36];//
charuser[32];//存放当前登陆的用户名
charcf;
typedefcharALFA[12];
ALFAKWORD[keynum];
//------------------------------------------------------------------------------------------------
structUFD{//用户文件管理模块
charfilename[32];//文件名
intsafecode;//文件保护码
longlength;//文件长度
}*curfile=NULL;
//------------------------------------------------------------------------------------------------
structMFD{//用户登陆信息管理模块
charusername[32];//用户名
boolfilepoint;//用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件
}*curuser=NULL,*elseuser=NULL;
typedefUFDUFD;
typedefMFDMFD;
//voidmain();
voidKeyWord();
intLoginDisplay();
boolLogin(intSELETE);
voidDisplayUFD();
voidByeFile(boolBOOL);
boolClearUserFile();
voidClearUserMes();
voidDeleteUser();
voidCreatFile();
voidDeleteFile();
voidListAllFile();
voidWriteLengthToFile(intLen,boolBOOL);
voidOpenFile();
boolQueryModElse(boolBOOL,bool&flag);
boolQueryMod(boolBOOL);
boolWriteRight(intlen,boolBOOL);
voidWriteFile();
voidReadFile();
voidChangeMod();
voidExecute(inti,intlen,intcmdset);
voidCommand();
voidmain()
{
while
(1){
intSELETE=LoginDisplay();
if(SELETE==0)
exit(0);
boolBOOL=Login(SELETE);//用户登陆,或者注册函数
if(BOOL)
{
KeyWord();//初始化命令关键字
DisplayUFD();//打印用户目录下的文件
Command();//命令行操作
}
}
}
//------------------------------------------------------------------------------------------------
voidKeyWord()//初始化命令关键字
{
strcpy(KWORD[1],"bye");strcpy(KWORD[2],"chmod");//将命令字符放入字符数组kword中
strcpy(KWORD[3],"close");strcpy(KWORD[4],"create");
strcpy(KWORD[5],"delete");strcpy(KWORD[6],"list");
strcpy(KWORD[7],"open");strcpy(KWORD[8],"read");
strcpy(KWORD[9],"write");
}
//------------------------------------------------------------------------------------------------
intLoginDisplay()//登陆选项操作函数
{
intSELETE_1=0;
do
{
cout<<"*****请选择操作*****\n1、用户登陆2、用户注册0、退出"<cin>>SELETE_1;
if(SELETE_1<0||SELETE_1>2){
cout<<"请输入0-2之间的数字!
"<}
}while(SELETE_1<0||SELETE_1>2);//当输入数非0,1,2进行循环
system("cls");//清屏
returnSELETE_1;
}
//------------------------------------------------------------------------------------------------
boolLogin(intSELETE)//用户登陆,注册函数
{
FILE*fp,*fp1,*fp2;
charname[12];
switch(SELETE)
{
case1:
//用户登陆
if((fp=fopen("LOGIN.exe","rb"))==NULL)//打开用户注册目录管理文件
{
cout<<"\n错误:
不能打开登陆文件。
"<cout<<"\n输入任意键继续"<getch();system("cls");
returnfalse;
}
curuser=getspace(MFD);//curuser申请等同于MFD结构所占大小的空间
cout<<"\n*****登陆*****\n用户名:
";
cin>>name;//输入用户登陆名
while(!
feof(fp))//检查该用户是否合法
{
fread(curuser,sizeof(MFD),1,fp);//从fp中读取MFD空间大小的1个元素放入curuser中的username
if(strcmp(curuser->username,name)==0)//比较curuser中的username和name,如果相同返回
break;
}
if(feof(fp))//如果没有找到跟当前登陆用户名相同的管理信息,提示出错
{
cout<<"\n错误:
该用户不存在。
"<fclose(fp);
returnfalse;
}
else//如果找到跟当前登陆用户名相同的管理信息,返回true
{
fclose(fp);
returntrue;
}
break;
case2:
//新用户注册
if((fp=fopen("LOGIN.exe","ab"))==NULL)//如果登陆信息管理文件不存在
fp=fopen("LOGIN.exe","wb+");//创建该信息管理文件
charname[12];
curuser=getspace(MFD);
while
(1)
{
cout<<"\n*****新用户注册*****"<cout<<"用户名:
";
cin>>name;//输入用户注册名
fp1=fopen("LOGIN.exe","rb");
while(!
feof(fp1))//查看该用户名是否被别的用户占用
{
fread(curuser,sizeof(MFD),1,fp1);
if(strcmp(curuser->username,name)==0)//该名称已经被使用
{
cout<<"\n该用户已经存在,按任意键重新输入!
"<cf=getchar();
}
}
if(feof(fp1))//该名称没有被别的用户占用
{
strcpy(curuser->username,name);//将输入的名称放入curuser->username
curuser->filepoint=NULL;//初始化当前MFD指针
fwrite(curuser,sizeof(MFD),1,fp);//给文件写入当前输入的名称
strcpy(user,curuser->username);//生成用户文件管理模块
strcat(user,".exe");//用于管理用户目录下的各个文件
fp2=fopen(user,"wb+");
fclose(fp2);
cout<<"\n注册成功!
"<fclose(fp1);
fclose(fp);
break;
}
}
if(cf=='#')
{
cf='#';
system("cls");
return0;
}
fp=fopen("LOGIN.exe","rb");//显示当前注册用户的名称
while
(1)
{
fread(curuser,sizeof(MFD),1,fp);
if(feof(fp))//如果读文件结束跳出循环
break;
cout<username<getch();
}
fclose(fp);
returntrue;
break;
default:
returnfalse;
break;
}
}
//------------------------------------------------------------------------------------------------
voidDisplayUFD()//打印用户信息,包括用户的各个文件
//名称、长度和操作权限的设置信息
{
if(curuser->filepoint==false)//当前用户目录下没有任何文件存在
cout<<"\n用户"<username<<"文件夹是空的"<else
{//存在文件,将所有文件信息打印在终端
FILE*fp;
charfilename[12];
strcpy(filename,curuser->username);
strcat(filename,".exe");
if((fp=fopen(filename,"rb"))==NULL)//打开用户文件信息管理模块
{
cout<<"\n无法打开用户:
"<username<<"的文件!
"<getch();
return;
}
else
{//读入并将用户全部文件信息打印在终端
cout<<"用户:
"<username<<"目录下的文件:
"<UFD*ufd;
inti=0;
ufd=getspace(UFD);//申请存放用户文件模块的空间
while
(1)
{
fread(ufd,sizeof(UFD),1,fp);
if(feof(fp))//全部输出完毕,结束
break;
else//打印信息
cout<filename<<"\t"<length<<"\t"<safecode<}
}
fclose(fp);
}
}
//------------------------------------------------------------------------------------------------
voidByeFile(boolBOOL)//注销函数,调用次函数用户可以退出系统
{
FILE*infile,*outfile;
charout[50];
strcpy(out,"outfilelocate.exe");//将要注销后的内容放入out数组中
if((infile=fopen("LOGIN.exe","rb"))==NULL)//如果用户为空输出保存错误并返回
{
cout<<"\n保存错误。
";//fcl