操作系统试验.docx
- 文档编号:30398985
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:27
- 大小:332.51KB
操作系统试验.docx
《操作系统试验.docx》由会员分享,可在线阅读,更多相关《操作系统试验.docx(27页珍藏版)》请在冰豆网上搜索。
操作系统试验
重庆交通大学
学生实验报告
实验课程名称计算机操作系统
开课实验室数学实验室
学院理学院年级09专业班信息2班
学生姓名zhouhoufei学号
开课时间2011至2012学年第1学期
评分细则
评分
报告表述的清晰程度和完整性(20分)
程序设计的正确性(40分)
实验结果的分析(30分)
实验方法的创新性(10分)
总成绩
教师签名
邱俊
实验:
文件系统试验
1、实验目的
文件系统是操作系统用来存储和管理信息的机构。
文件系统具有按名存取的功能。
文件系统向用户提供一整套的文件系统调用命令。
在用户程序中通过使用文件系统提供的命令对文件进行操作。
本实验要求学生用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,
2、实验要求:
设计一个n个用户的文件系统,每个用户最多可保存m个文件;
限制用户在一次运行中只可以最多打开L个文件;
系统已能检查打入的命令的正确性,出错时要能显示出错原因;
对文件必须设置保护措施,如允许执行、允许读、允许写等。
在每次打开文件时,根据本次打开的要求,再次设置保护级别,即可有二级保护;
对文件的操作至少应有下述几条指令:
create建立文件;
delete删除文件;
open打开文件;
close关闭文件;
read读文件;
write写文件;
3、设计思想和算法流程图
1)总体设计
在实验中设计一个10个用户的文件系统,每个用户最多可保存10个文件,一次运行中用户可打开5个文件。
程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。
前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名、保护码、文件长度以及它们存放的位置等。
另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。
为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不实际读写。
指令系统如表格1所示:
序号
指令
说明
1
shutdown
关机
2
logout
用户在登录状态下退出登录
3
dir
列出用户的文件目录
4
diropen
列出用户当前打开的文件目录
5
create
建立文件
6
delete
删除文件
7
open
打开文件
8
close
关闭文件
9
read
读文件
10
write
写文件
2)数据结构的定义
●逻辑设计
主文件目录(MFD):
主文件目录的每一项要记录各用户的用户名和指向UFD的文件目录指针。
用户文件目录(UFD):
用户文件目录的每一项对应着一个文件,所以其中要记录文件名、文件长度以及保护码。
运行文件目录(AFD):
运行文件目录中的每一项对应着一个正在运行的文件,所以要记录被打开的文件号(即相对该用户的UFD的指针)、打开的模式(即打开的保护码)以及读写指针。
●物理设计
主文件目录(MFD):
structTYPE_MFD//主文件目录
{
stringUser_Name;//用户名
TYPE_UFD*Pointer;//用户文件目录指针
};
用户文件目录(UFD):
structTYPE_UFD//用户文件目录
{
stringFile_Name;//文件名
boolRead;//读保护码,true为可读
boolWrite;//写保护码,true为可写
boolExecute;//执行保护码,true为可执行
intLength_File;//文件长度
};
运行文件目录(AFD):
structTYPE_AFD//打开文件目录
{
intFile_ID;//打开的文件号
boolRead;//读保护码,true为可读
boolWrite;//写保护码,true为可写
boolExecute;//执行保护码,true为可执行
intPointer;//读写指针
};
图1文件系统流程图
图2创建文件命令流程图
图3打开文件命令流程图
一些测试结果:
登录和logout的测试结果
create和delete测试结果
open和close的测试结果
4、代码
#include
#include
#defineN10
#defineL10
#defineS6
structmfd_type
{
charuname[20];
intuaddr;
};
structufd_type
{
charfname[20];
charfattr[10];
intrecordl;
intaddrf;
};
structuof_type
{
charfname[20];
charfattr[10];
intrecordl;
charfstatue;//1:
建立0:
打开
intreadp;
intwritep;
};
intfdph[N*L];//存放文件在磁盘上的第一个空间编号
intfdpt[N*L];//存放文件在磁盘上的最末一个空间编号
intdisk[400];//存放磁盘空闲块号
intdiskt,diskh;//空闲块的尾、首指针最末
structmfd_typemfd[N];
structufd_typeufd[N*L];
structuof_typeuof[N*S];
inttemp,mi,ni,uno,ucounter;
voidcreate(charcfname[20],intcrecordl,charcfattr[10])
{
intcltemp1=uno*L,cltemp2=(uno+1)*L,frd;
while((cltemp1 =0)) cltemp1++; if(strcmp(ufd[cltemp1].fname,cfname)! =0) { cltemp1=uno*L; while((cltemp1 =0))cltemp1++; if(strcmp(ufd[cltemp1].fname,"")==0) { frd=cltemp1; cltemp1=uno*S; cltemp2=(uno+1)*S; while((cltemp1 =0))cltemp1++; if(strcmp(uof[cltemp1].fname,"")==0) { if(disk[diskh]! =-1) { strcpy(uof[cltemp1].fname,cfname); strcpy(uof[cltemp1].fattr,cfattr); uof[cltemp1].recordl=crecordl; uof[cltemp1].fstatue=1; uof[cltemp1].readp=disk[diskh]; uof[cltemp1].writep=disk[diskh]; fdph[frd]=disk[diskh]; fdpt[frd]=disk[diskh]; strcpy(ufd[frd].fname,cfname); strcpy(ufd[frd].fattr,cfattr); ufd[frd].recordl=crecordl; ufd[frd].addrf=disk[diskh]; diskh=disk[diskh]; printf("%s\n","文件建立成功! "); } elseprintf("%s\n","磁盘没有空间,不能建文件! "); } elseprintf("%s\n","没有空的登记拦1,不能建文件"); } elseprintf("%s\n","没有空的登记拦2,不能建文件"); } elseprintf("%s\n","同名文件不能建立! "); }; voidopen(charpfname[20],charooptype[10]) { intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S; while((cltemp1 =0))cltemp1++; if(strcmp(ufd[cltemp1].fname,pfname)==0) { while((cltemp3 =0))cltemp3++; if(strcmp(uof[cltemp3].fname,pfname)==0)//有文件 { if(uof[cltemp3].fstatue==0)printf("%s\n","文件已打开! "); elseprintf("%s\n","此文件正在建立,不能打开! "); } else//无文件 { if(strcmp(ufd[cltemp1].fattr,ooptype)! =0)printf("%s\n","操作不合法,不能打开! "); else { cltemp3=uno*S; while((cltemp3 =0))cltemp3++; if(strcmp(uof[cltemp3].fname,"")) printf("%s\n","在已开表中没有空拦,不能打开文件! "); else { strcpy(uof[cltemp3].fname,pfname); uof[cltemp3].recordl=ufd[cltemp1].recordl; strcpy(uof[cltemp3].fattr,ufd[cltemp1].fattr); uof[cltemp3].readp=ufd[cltemp1].addrf; uof[cltemp3].writep=ufd[cltemp1].addrf; uof[cltemp3].fstatue=0; printf("%s\n","打开文件成功! "); } } } } else printf("%s\n","此文件已不存在,不能打开! "); }; voidwrite(charwfname[20],intwrecordno) { intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S; while((cltemp3 =0))cltemp3++; if(strcmp(uof[cltemp3].fname,wfname))printf("文件没有建立或打开,不能写");//在已开文件中没有次文件,不能写 else//文件建立或打开 { if(uof[cltemp3].fstatue)//建立 { printf("%s%d%s","写第",uof[cltemp3].writep,"块空间! "); if(disk[diskt]==-1) printf("%s\n","没有空闲块不能写! "); else { uof[cltemp3].writep=disk[diskt]; diskt=disk[diskt]; printf("%s\n","写文件成功! "); } } else//打开 { if(strcmp(uof[cltemp3].fattr,"r")==0) printf("%s\n","操作不合法,不能写! "); else { if(disk[diskt]==-1) printf("%s\n","没有空闲块不能写! "); else { printf("%s%d%s\n","写第",uof[cltemp3].writep,"块空间! "); uof[cltemp3].writep=disk[uof[cltemp3].writep]; printf("%s\n","写文件成功! "); } } } } }; voidread(charrfname[20],intrreadl) { intcltemp1=uno*S,cltemp2=(uno+1)*S,frd; while((cltemp1 =0))cltemp1++; if(strcmp(uof[cltemp1].fname,rfname)==0) { printf("%s%d%s\n","第",uof[cltemp1].readp,"块读"); frd=fdph[uno*L]; while((cltemp2! =disk[frd])&&(disk[frd]! =-1))frd=disk[frd]; uof[cltemp1].readp=disk[frd]; printf("%s\n","文件读成功");} elseprintf("%s\n","文件未打开不能读"); }; voidclose(charcofname[20]) { intcltemp1=uno*S,cltemp2=(uno+1)*S; while((cltemp1 =0))cltemp1++; if(strcmp(uof[cltemp1].fname,cofname)==0) { printf("uof[cltemp1].fname=%s,cofname%s\n",uof[cltemp1].fname,cofname); cltemp2=uof[cltemp1].fstatue; printf("uof[cltemp1].fstatue=%d\n",cltemp2); switch(cltemp2) { case1: printf("%s\n","写文件结束符。 ");//置文件结束状态 case0: strcpy(uof[cltemp1].fname,""); printf("%s\n","关闭文件成功");break; default: printf("%s\n","文件已关闭"); } } else printf("%s\n","文件不存在! "); }; voiddeletef(chardfname[20]) { intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S; while((cltemp1 =0))cltemp1++; if(strcmp(ufd[cltemp1].fname,dfname)==0) { while((cltemp3 =0))cltemp3++; if(strcmp(uof[cltemp3].fname,dfname)==0)strcpy(uof[cltemp1].fname,""); disk[diskt]=fdpt[cltemp1]; strcpy(ufd[cltemp1].fname,""); printf("%s\n","此文件撤消成功! "); } else printf("%s\n","此文件已撤消! "); }; voidlist() { inttemp,temp1,fcounter=0,fucounter=0; printf("文件名文件属性记录长度文件首地址\n"); for(temp=0;temp { fucounter=0; printf("用户名为%s的用户拥有的文件: \n",mfd[temp].uname); for(temp1=temp*L;temp1<(temp+1)*L;temp1++) { if(strcmp(ufd[temp1].fname,"")>0) { printf("%s%s%d%d\n",ufd[temp1].fname,ufd[temp1].fattr,ufd[temp1].recordl,ufd[temp1].addrf); fucounter++; fcounter++; } } printf("该用户文件总数: %d\n",fucounter); } printf("系统拥有文件总数: %d\n",fcounter); }; intmain() { intmmi,temp,temp1; charfname[20],cfattr[10],ooptype[10],chtemp[10]; intrecordl,rreadl; intchlen; charmun[20],inst[10],insts[10],instta[8][10]; strcpy(instta[0],"create"); strcpy(instta[1],"open"); strcpy(instta[2],"write"); strcpy(instta[3],"read"); strcpy(instta[4],"close"); strcpy(instta[5],"deletef"); strcpy(instta[6],"list"); strcpy(instta[7],"end"); printf("\n"); for(temp=0;temp { strcpy(mfd[temp].uname,""); mfd[temp].uaddr=0; } for(temp=0;temp { strcpy(ufd[temp].fname,""); strcpy(ufd[temp].fattr,""); ufd[temp].addrf=0; ufd[temp].recordl=0; } for(temp=0;temp { strcpy(uof[temp].fname,""); strcpy(uof[temp].fattr,""); uof[temp].fstatue=0; uof[temp].readp=0; uof[temp].recordl=0; uof[temp].writep=0; } printf("请输入用户总数: "); scanf("%d",&ucounter); printf("请输入文件目录表(用户名和用户首地址),输入e/E0为结束。 \n"); for(temp=0;temp { scanf("%s%d",chtemp,&(mfd[temp].uaddr)); if(((chtemp,"e")==0)||(strcmp(chtemp,"E")==0))break; strcpy(mfd[temp].uname,chtemp); } ucounter=temp; printf("输入文件目录表结束。 \n"); for(temp1=0;temp1 { printf("请输入第%d个用户的目录表。 \n",temp1+1); printf("请输入用户目录表(文件名文件属性(r/w)文件记录长度文件首地址,输入e/Ee00为结束。 \n"); for(temp=temp1*L;temp<(temp1+1)*L;temp++) { scanf("%s%s%d%d",chtemp,ufd[temp].fattr,&(ufd[temp].recordl),&(ufd[temp].addrf)); if((strcmp(chtemp,"e")==0)||(chtemp,"E")==0)break; strcpy(ufd[temp].fname,chtemp); //printf("%s,%s,%d,%d\n",ufd[temp].fname,ufd[temp].fattr,ufd[temp].recordl,ufd[temp].addrf); } } printf("用户目录表输入结束。 "); for(temp1=0;temp1 { printf("请输入第%d个用户的已开文件表。 \n",temp1+1); printf("%s\n","请输入用户已开文件表,e/Ee0000为结束。 \n文件名文件属性(r/w)文件记录长度文件状态(0/1),文件读文件写\n"); for(temp=temp1*S;temp<(temp1+1)*S;temp++) { scanf("%s%s%d%d%d%d",chtemp,uof[temp].fattr,&(u
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 试验