操作系统试验.docx
重庆交通大学学生实验报告实验课程名称计算机操作系统开课实验室数学实验室学院 理学院年级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所示:序 号指令说明1shutdown关机2logout用户在登录状态下退出登录3dir列出用户的文件目录4diropen列出用户当前打开的文件目录5create建立文件6delete删除文件7open打开文件8close关闭文件9read读文件10write写文件2)数据结构的定义.逻辑设计主文件目录(MFD):主文件目录的每一项要记录各用户的用户名和指向UFD的文件目录指针。用户文件目录(UFD):用户文件目录的每一项对应着一个文件,所以其中要记录文件名、文件长度以及保护码。运行文件目录(AFD):运行文件目录中的每一项对应着一个正在运行的文件,所以要记录被打开的文件号(即 相对该用户的UFD的指针)、打开的模式(即打开的保护码)以及读写指针。 物理设计主文件目录(MFD):struct TYPE_MFD/主文件目录string User_Name;/用户名TYPE_UFD *Pointer;/用户文件目录指针;用户文件目录(UFD):struct TYPE_UFD/用户文件目录stringFile_Name;/文件名boolRead;读保护码,true为可读boolWrite;写保护码,true为可写boolExecute;执行保护码,true为可执行intLength_File;/文件长度运行文件目录(AFD):struct TYPE_AFD/打开文件目录intFile_ID;/打开的文件号boolRead;读保护码,true为可读boolWrite;写保护码,true为可写boolExecute;执行保护码,true为可执行intPointer;读写指针;图1文件系统流程图开始图2创建文件命令流程图开始馆出错误信息已达到 京件上用,亦辟创津文件辖出话误梧息一帽误的文件名该用户已建打开了牙、件系纬所黄M的最大 '是数量的文件数?."技枚文件名-该文件在用户'、'、文件目录中? /一务 系用户打开的文件费痢一在逐行文件目录中会入文件号接收文件的打开保护玛,并登人运行文件目录中辖出正暗打开文罟提示返互图3打开文件命令流程图一些测试结果:User name:updOk , ueleone to login , upd ?C:wpd>dirFile name updl.txt upd2.txtFiles of user wpd State Length RE10R20C:wpd>createPlease enter the information of the neu file:File name : upd0Read <y/n>:Write <y/n>:Execute <y/n>:Length :10Ok . the new f ile upd0C:wpd>diris created*Files of userupdStateLengthFile nameRE10wpdl.txtB20vjpd2 .txtRUE10vjpdOC:wpd>logoutOk , see youlater , upd !User name:updOk , ueleone 1to login ,wpd ?C:wpd>dirFiles of userwpdStateLengthFile nameRE10wpdl.txtB20wpd2.txtRHE10vjpdOcreate和delete测试结果upd !User name:upd Ok , ueleone to login , C:wpd>dirFiles £ user State R-E RupdLength1020File nameupdl.txtupd2.txt:wpd>createlease enter the information of the neu File:File name : updSRead :Write <y/n>:Execute <y/n>:Length :10is createdfOk , the neu file updS C:wpd>dirFiles £ user State R-E R R-EupdLength102010File nameupdl.txtupd2.txtupdSC:wpd>deletePlease enter the fileOk , the fileC:wpd>dirupdS isname :updS deleted .Files £ user State R-E RupdLength1020File nameupdl.txtupd2.txtC:wpd>C:wpd>dirFiles of userupdStateLengthFilenameR-E10updl.txtR20upd2.txtRUE10updOC:wpd>openPlease enter kthe file inameupd0Flease configure the open mode :Read :Write <y/n>:Execute <y/n >:Ok , the file upd0 is open .C:wpd>diropenOpening Files of user wpd State Open File name RUE upd0C:wpd>openPlease enter the f ile name :updBad file name , please try again .C:wpd>closePlease enter the f ile name :updl.txt The file updl.txt isn't open .C:wpd>closePlease enter the file name :updO Ok , the file upd0 is closed . C:wpd>diropenOpening Files of user wpd State Open File nameC=»pd>4、代码#include<stdio.h> #include<string.h>#define N 10#define L 10#define S 6struct mfd_typechar uname20;int uaddr;;struct ufd_type(char fname20;char fattr10;int recordl;int addrf;struct uof_type(char fname20;char fattr10;int recordl;char fstatue;/1:建立 0:打开int readp;int writep;int fdphN*L;/存放文件在磁盘上的第一个空间编号int fdptN*L;/存放文件在磁盘上的最末一个空间编号int disk400;/存放磁盘空闲块号int diskt,diskh;/空闲块的尾、首指针最末struct mfd_type mfdN;struct ufd_type ufdN *L;struct uof_type uofN *S;int temp,mi,ni,uno ,ucounter;void create(char cfname20,int crecordl,char cfattr10)(int cltemp1=uno*L,cltemp2=(uno+1)*L,frd;while(cltemp1<cltemp2)&&(strcmp(ufdcltemp1.fname,cfname)!=0)cltemp1+;if(strcmp(ufdcltemp1.fname,cfname)!=0)(cltemp1=uno*L;while (cltemp1<cltemp2)&&(strcmp(ufdcltemp1.fname,"")!=0) cltemp1+;if(strcmp(ufdcltemp1.fname,"")=0)(frd=cltemp1;cltemp1=uno*S;cltemp2=(uno+1)*S;while(cltemp1<cltemp2)&&(strcmp(uofcltemp1.fname,"")!=0) cltemp1+;if(strcmp(uofcltemp1.fname,"")=0)(if (diskdiskh!=-1)(strcpy(uofcltemp1.fname,cfname);strcpy(uofcltemp1.fattr,cfattr);uofcltemp1.recordl=crecordl;uofcltemp1.fstatue=1;uofcltemp1.readp=diskdiskh;uofcltemp1.writep=diskdiskh;fdphfrd=diskdiskh;fdptfrd=diskdiskh;strcpy(ufdfrd.fname,cfname);strcpy(ufdfrd.fattr,cfattr);ufdfrd.recordl=crecordl;ufdfrd.addrf=diskdiskh;diskh=diskdiskh;printf("%sn","文件建立成功!");else printf("%sn","磁盘没有空间,不能建文件!");else printf("%sn","没有空的登记拦1,不能建文件");else printf("%sn","没有空的登记拦2,不能建文件");else printf("%sn","同名文件不能建立!");void open(char pfname20,char ooptype10)(int cltemp1=uno*L,cltemp2=(uno+1)*L;int cltemp3=uno*S,cltemp4=(uno+1)*S;while(cltemp1<cltemp2)&&(strcmp(ufdcltemp1.fname,pfname)!=0) cltemp1+;if(strcmp(ufdcltemp1.fname,pfname)=0)(while(cltemp3<cltemp4)&&(strcmp(uofcltemp3.fname,pfname)!=0) cltemp3+;if(strcmp(uofcltemp3.fname,pfname)=0)/有 文件(if(uofcltemp3.fstatue=0) printf("%sn","文件已打开!");else printf("%sn","此文件正在建立,不能打开!");else/无文件 (if(strcmp(ufdcltemp1.fattr,ooptype)!=0) printf("%sn","操作不合法,不能打开!");else(cltemp3=uno*S;while(cltemp3<cltemp4)&&(strcmp(uofcltemp3.fname,"")!=0) cltemp3+;if(strcmp(uofcltemp3.fname,"")printf("%sn","在已开表中没有空拦,不能打开文件!");else(strcpy(uofcltemp3.fname,pfname);uofcltemp3.recordl=ufdcltemp1.recordl;strcpy(uofcltemp3.fattr,ufdcltemp1.fattr);uofcltemp3.readp=ufdcltemp1.addrf;uofcltemp3.writep=ufdcltemp1.addrf;uofcltemp3.fstatue=0;printf("%sn","打开文件成功!");elseprintf("%sn","此文件已不存在,不能打开!");void write(char wfname20,int wrecordno)(int cltemp1=uno*L,cltemp2=(uno+1)*L;int cltemp3=uno*S,cltemp4=(uno+1)*S;while(cltemp3<cltemp4)&&(strcmp(uofcltemp3.fname,wfname)!=0)cltemp3+;if(strcmp(uofcltemp3.fname,wfname) printf("文件没有建立或打开,不能写,在已开文件中没有次文件,不能写else/文件建立或打开(if(uofcltemp3.fstatue)/建立(printf("%s%d%s","写第",uofcltemp3.writep,"块空间!"); if(diskdiskt=-1)printf("%sn","没有空闲块不能写!,else(uofcltemp3.writep=diskdiskt;diskt=diskdiskt;printf("%sn","写文件成功!");else/打开(if(strcmp(uofcltemp3.fattr,"r")=0)printf("%sn","操作不合法,不能写!");else(if(diskdiskt=-1)printf("%sn","没有空闲块不能写!,else(printf("%s%d%sn","写第",uofcltemp3.writep,"块空 间!,uofcltemp3.writep=diskuofcltemp3.writep;printf("%sn”,”写文件成功!”);;void read(char rfname20,int rreadl)(int cltemp1=uno*S,cltemp2=(uno+1)*S,frd;while(cltemp1<cltemp2)&&(strcmp(uofcltemp1.fname,rfname)!=0)cltemp1+;if(strcmp(uofcltemp1.fname,rfname)=0)(printf("%s%d%sn","第",uofcltemp1.readp,"块读");frd=fdphuno*L;while (cltemp2!=diskfrd)&&(diskfrd!=-1) frd=diskfrd;uofcltemp1.readp=diskfrd;printf("%sn","文件读成功,else printf("%sn","文件未打开不能读");void close(char cofname20)(int cltemp1=uno*S,cltemp2=(uno+1)*S;while (cltemp1<cltemp2)&&(strcmp(uofcltemp1.fname,cofname)!=0) cltemp1+;if(strcmp(uofcltemp1.fname,cofname)=0)(printf("uofcltemp1.fname=%s,cofname%sn",uofcltemp1.fname,c ofname);cltemp2=uofcltemp1.fstatue;printf("uofcltemp1.fstatue=%dn",cltemp2);switch (cltemp2)(case 1:printf("%sn","写文件结束符。");/置文件结束状态case 0:strcpy(uofcltemp1.fname,"");printf("%sn","关闭文件成功");break;default:printf("%sn","文件已关闭");elseprintf("%sn","文件不存在!");void deletef(char dfname20)(int cltemp1=uno*L,cltemp2=(uno+1)*L;int cltemp3=uno*S,cltemp4=(uno+1)*S;while(cltemp1<cltemp2)&&(strcmp(ufdcltemp1.fname,dfname)!=0)cltemp1+;if(strcmp(ufdcltemp1.fname,dfname)=0)(while(cltemp3<cltemp4)&&(strcmp(uofcltemp3.fname,dfname)!=0)cltemp3+;if(strcmp(uofcltemp3.fname,dfname)=0)strcpy(uofcltemp1.fname,"");diskdiskt=fdptcltemp1;strcpy(ufdcltemp1.fname,"");printf("%sn","此文件撤消成功!");elseprintf("%sn","此文件已撤消!");void list()(int temp,temp1,fcounter=0,fucounter=0;printf(-文件名文件属性记录长度文件首地址n");for(temp=0;temp<ucounter;temp+)(fucounter=0;printf("用户名为的用户拥有的文件:n",mfdtemp.uname);for(temp1=temp* L;temp1<(temp+1)*L;temp1+)(if (strcmp(ufdtemp1.fname,"")>0)(printf("%s %s%d%dn",ufdtemp1.fname,ufdtemp1.fattr,ufdtemp1.recordl,ufdtemp1.addrf );fucounter+;fcounter+;printf("该用户文件总数:dn",fucounter);;int main()(int mmi,temp,temp1;char fname20,cfattr10,ooptype10,chtemp10;int recordl,rreadl;int chlen;char mun20,inst10,insts10,instta810;strcpy(instta0,"create");strcpy(instta1,"open");strcpy(instta2,"write");strcpy(instta3,"read");strcpy(instta4,"close");strcpy(instta5,"deletef");strcpy(instta6,"list");strcpy(instta7,"end");printf("n");for(temp=0;temp<N;temp+)(strcpy(mfdtemp.uname,"");mfdtemp.uaddr=0;for(temp=0;temp<N*L;temp+)(strcpy(ufdtemp.fname,"");strcpy(ufdtemp.fattr,"");ufdtemp.addrf=0;ufdtemp.recordl=0;for(temp=0;temp<N*S;temp+)(strcpy(uoftemp.fname,"");strcpy(uoftemp.fattr,"");uoftemp.fstatue=0;uoftemp.readp=0;uoftemp.recordl=0;uoftemp.writep=0;printf(-请输入用户总数:");scanf("%d",&ucounter);printf(-请输入文件日录表(用户名和用户首地址),输入e/E 0为结 束。n");for(temp=0;temp<ucounter;temp+)scanf("%s%d",chtemp,&(mfdtemp.uaddr);if(chtemp,"e")=0)ll(strcmp(chtemp,"E")=0) break;strcpy(mfdtemp.uname,chtemp);ucounter=temp;printf("输入文件目录表结束。n");for(temp1=0;temp1<ucounter;temp1+)(printf("请输入第d个用户的目录表。n" ,temp1+1);printf("请输入用户目录表(文件名文件属性(r/w)文件记录 长度 文件首地址,输入e/E e 0 0为结束。n");for(temp=temp1* L;temp<(temp1+1)*L;temp+)(scanf("%s%s%d%d",chtemp,ufdtemp.fattr,&(ufdtemp.recordl),&( ufdtemp.addrf);if(strcmp(chtemp,"e")=0)|(chtemp,"E")=0) break;strcpy(ufdtemp.fname,chtemp);/printf("%s,%s,%d,%dn",ufdtemp.fname,ufdtemp.fattr,ufdtemp.r ecordl,ufdtemp.addrf);printf("用户目录表输入结束。");for(temp1=0;temp1<ucounter;temp1+)(printf("请输入第d个用户的已开文件表。n" ,temp1+1);printf("%sn","请输入用户已开文件表,e/E e 0 0 0 0为结束。n 文件名 文件属性(r/w)文件记录长度 文件状态(0/1),文件读 文 件写n");for(temp= temp1* S;temp<(temp1+1)*S;temp+)(scanf("%s%s%d%d%d%d",chtemp,uoftemp.fattr,&(uoftemp.recor dl),&(uoftemp.fstatue),&(uoftemp.readp),&(uoftemp.writep);if(strcmp(chtemp,"e")=0)|(strcmp(chtemp,"E")=0) break; strcpy(uoftemp.fname,chtemp);/printf("%s,%s,%d,%d,%d,%dn",uoftemp.fname,uoftemp.fattr,uof temp.recordl,uoftemp.fstatue,uoftemp.readp,uoftemp.writep);printf("%sn","输入用户已开文件表结束。");diskh=0;diskt=399;while(1)(printf("%sn","请输入用户名");scanf("%s",mun);uno=0;while(uno<ucounter)&&(strcmp(mfduno.uname,mun)!=0)uno+;/ printf("uno=%dn",uno);if(uno!=ucounter)(printf("%sn","请输入命令:");scanf("%s",inst);/printf("%sn",inst);/printf("!n");mi=0;chlen=strlen(inst);while(instmi!='(')&&(mi<chlen)instsmi=instmi;mi+;instsmi='0'/printf("!n");/ printf("%sn",insts);mmi=0;while(mmi<=7)&&(strcmp(insttammi,insts)!=0) mmi+;/printf("%dn",mmi);switch(mmi)(case 0:ni=0;mi+;while(instmi!=',')fnameni=instmi;mi+;ni+;mi+;fnameni='0'ni=0;recordl=0;while(instmi!=',')recordl=recordl*10+(instmi-48);mi+;ni+;mi+;ni=0;while(instmi!=')')cfattrni=instmi;mi+;ni+;mi+;cfattrni='0'printf("%s,%d,%sn",fname,recordl,cfattr);create(fname,recordl,cfattr);break;case 1:ni=0;mi+;while(instmi!=',')fnameni=instmi;mi+;ni+;mi+;fnameni='0'ni=0;while(instmi!=')')ooptypeni=instmi;mi+;ni+;ooptypeni='0'open(fname, ooptype);break;case 2:ni=0;mi+;while(instmi!=',')fnameni=instmi;mi+;ni+;mi+;fnameni='0'recordl=0;while(instmi!=')')recordl=recordl*10+(instmi-48);mi+;printf("%s,%dn",fname,recordl);write(fname,recordl);break;case 3:ni=0;mi+;while(instmi!=',') fnameni=instmi;mi+;ni+;mi+;fnameni='0'ni=0;mi+;rreadl=0;while(instmi!=')')rreadl=rreadl*10+(instmi-48);mi+;ni+;read(fname,rreadl);break;case 4:ni=0;mi+;while(instmi!=')')fnameni=instmi;mi+;ni+;fnameni='0'close(fname);break;case 5:ni=0;mi+;while(instmi!=')')fnameni=instmi;mi+;ni+;fnameni='0'printf("deletef fname=%sn",fname);deletef(fname);break;case 6:ni=0;mi+;list();break;case 7:return 0;default:printf("%s","输入的命令错");/ else printf("该用户不存在!请从输入用户名! n");return 0;5、测试结果由于测试太长,现截取部分测试结果!6、实验体会通过本实验,我深刻体会到了文件管理系统中“二级日录”管理的管 理结构特点及其管理操作的代码本质,其中涉及的各类数据结构多, 在编写代码过程中,加深了对“各类数据结构”的理解。其中,各类 文件操作命令的本质是通过检索文件属性及其列表来实现的,通过设 置文件属性来允许不同的文件操作命令!