《2022年操作系统文件系统实验程序》由会员分享,可在线阅读,更多相关《2022年操作系统文件系统实验程序(11页珍藏版)》请在金锄头文库上搜索。
1、一 . 实验目的用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验要求要求设计一个n 个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create 、delete 、open、close 、read 、write等命令。程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD )。另外,为打开文件设置了运行文件目录(AFD )。在执行读写命令时,需改读写指针。因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行
2、、对应位为1,对应位为0,则表示不允许读写、执行。程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD 、UFD )、打开文件目录( AFD )(即运行文件目录)M D F 用户名文件目录指针U F D 文件名保护码文件长度A F D 打开文件名打开保护码读写指针文件系统算法的流程图如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - #include #include #define N 10 #define L
3、10 #define S 6 struct mfd_type char uname20; int uaddr; ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - struct ufd_type char fname20; char fattr10; int recordl; int addrf; ; struct uof_type char fname20; char fattr10; int recordl; char f
4、statue;/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 cfa
5、ttr10) int cltemp1=uno*L,cltemp2=(uno+1)*L,frd; while (cltemp1cltemp2)&(strcmp(ufdcltemp1.fname,cfname)!=0) cltemp1+; if(strcmp(ufdcltemp1.fname,cfname)!=0) cltemp1=uno*L; while (cltemp1cltemp2)&(strcmp(ufdcltemp1.fname,)!=0) cltemp1+; if(strcmp(ufdcltemp1.fname,)=0) frd=cltemp1; cltemp1=uno*S; clte
6、mp2=(uno+1)*S; while (cltemp1cltemp2)&(strcmp(uofcltemp1.fname,)!=0) cltemp1+; if(strcmp(uofcltemp1.fname,)=0) if (diskdiskh!=-1) strcpy(uofcltemp1.fname,cfname); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - strcpy(uofcltemp1.fattr,cfat
7、tr); 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, 文件建立成功!); els
8、e 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 (cltemp1cltemp2)&(strcmp(ufdcltemp1.fname,pfname)!
9、=0) cltemp1+; if(strcmp(ufdcltemp1.fname,pfname)=0) while (cltemp3cltemp4)&(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(%s
10、n,操作不合法, 不能打开! ); else cltemp3=uno*S; while (cltemp3cltemp4)&(strcmp(uofcltemp3.fname,)!=0) cltemp3+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - if(strcmp(uofcltemp3.fname,) printf(%sn, 在已开表中没有空拦,不能打开文件!); else strcpy(uofcltemp3.fname
11、,pfname); uofcltemp3.recordl=ufdcltemp1.recordl; strcpy(uofcltemp3.fattr,ufdcltemp1.fattr); uofcltemp3.readp=ufdcltemp1.addrf; uofcltemp3.writep=ufdcltemp1.addrf; uofcltemp3.fstatue=0; printf(%sn, 打开文件成功!); else printf(%sn, 此文件已不存在,不能打开!); ; void write(char wfname20,int wrecordno) int cltemp1=uno*L,
12、cltemp2=(uno+1)*L; int cltemp3=uno*S,cltemp4=(uno+1)*S; while (cltemp3cltemp4)&(strcmp(uofcltemp3.fname,wfname)!=0) cltemp3+; if(strcmp(uofcltemp3.fname,wfname) printf(文件没有建立或打开,不能写 );/ 在已开文件中没有次文件,不能写else/文件建立或打开 if(uofcltemp3.fstatue)/ 建立 printf(%s%d%s, 写第 ,uofcltemp3.writep,块空间! ); if(diskdiskt=-
13、1) printf(%sn, 没有空闲块不能写!); else uofcltemp3.writep=diskdiskt; diskt=diskdiskt; printf(%sn, 写文件成功!); else/打开 if(strcmp(uofcltemp3.fattr,r)=0) printf(%sn, 操作不合法,不能写!); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - if(diskdiskt=-1) prin
14、tf(%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 (cltemp1cltemp2)&(strcmp(uofcltemp1.fname,rfname)!=0) cltemp1+; if(strcmp(uofcltem
15、p1.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 (cltemp1cltemp2)&(strcmp
16、(uofcltemp1.fname,cofname)!=0) cltemp1+; if(strcmp(uofcltemp1.fname,cofname)=0) printf(uofcltemp1.fname=%s,cofname%sn,uofcltemp1.fname,cofname); cltemp2=uofcltemp1.fstatue; printf(uofcltemp1.fstatue=%dn,cltemp2); switch (cltemp2) case 1:printf(%sn, 写文件结束符。);/ 置文件结束状态case 0:strcpy(uofcltemp1.fname,);
17、 printf(%sn, 关闭文件成功);break; default:printf(%sn,文件已关闭 ); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - printf(%sn, 文件不存在!); ; void deletef(char dfname20) int cltemp1=uno*L,cltemp2=(uno+1)*L; int cltemp3=uno*S,cltemp4=(uno+1)*S; while
18、 (cltemp1cltemp2)&(strcmp(ufdcltemp1.fname,dfname)!=0) cltemp1+; if(strcmp(ufdcltemp1.fname,dfname)=0) while(cltemp3cltemp4)&(strcmp(uofcltemp3.fname,dfname)!=0) cltemp3+; if(strcmp(uofcltemp3.fname,dfname)=0) strcpy(uofcltemp1.fname,); diskdiskt=fdptcltemp1; strcpy(ufdcltemp1.fname,); printf(%sn, 此
19、文件撤消成功!); else printf(%sn, 此文件已撤消!); ; void list() int temp,temp1,fcounter=0,fucounter=0; printf( 文件名文件属性记录长度文件首地址 n); for(temp=0;tempucounter;temp+) fucounter=0; printf( 用户名为 %s 的用户拥有的文件:n,mfdtemp.uname); for(temp1=temp* L;temp10) printf(%s %s %d %dn ,ufdtemp1.fname,ufdtemp1.fattr,ufdtemp1.recordl,
20、ufdtemp1.addrf); fucounter+; fcounter+; printf( 该用户文件总数:%dn,fucounter); printf( 系统拥有文件总数:%dn,fcounter); ; int main() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - int mmi,temp,temp1; char fname20,cfattr10,ooptype10,chtemp10; int recordl,
21、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;tempN;temp+) strcpy(mfdtemp.uname,); mfd
22、temp.uaddr=0; for(temp=0;tempN*L;temp+) strcpy(ufdtemp.fname,); strcpy(ufdtemp.fattr,); ufdtemp.addrf=0; ufdtemp.recordl=0; for(temp=0;tempN*S;temp+) strcpy(uoftemp.fname,); strcpy(uoftemp.fattr,); uoftemp.fstatue=0; uoftemp.readp=0; uoftemp.recordl=0; uoftemp.writep=0; printf( 请输入用户总数:); scanf(%d,&
23、ucounter); printf( 请输入文件目录表(用户名和用户首地址),输入 e/E 0 为结束。 n); for(temp=0;tempucounter;temp+) scanf(%s%d,chtemp,&(mfdtemp.uaddr); if(chtemp,e)=0)|(strcmp(chtemp,E)=0) break; strcpy(mfdtemp.uname,chtemp); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - -
24、 - - - ucounter=temp; printf( 输入文件目录表结束。n); for(temp1=0;temp1ucounter;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(st
25、rcmp(chtemp,e)=0)|(chtemp,E)=0) break; strcpy(ufdtemp.fname,chtemp); / printf(%s,%s,%d,%dn,ufdtemp.fname,ufdtemp.fattr,ufdtemp.recordl,ufdtemp.addrf); printf( 用户目录表输入结束。); for(temp1=0;temp1ucounter;temp1+) printf( 请输入第 %d 个用户的已开文件表。n ,temp1+1); printf(%sn, 请输入用户已开文件表,e/E e 0 0 0 0为结束。 n 文件名文件属性(r/w
26、) 文件记录长度文件状态( 0/1) ,文件读文件写 n); for(temp= temp1* S;temp(temp1+1)*S;temp+) scanf(%s%s%d%d%d%d,chtemp,uoftemp.fattr,&(uoftemp.recordl),&(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,uofte
27、mp.fname,uoftemp.fattr,uoftemp.recordl,uoftemp.fstatue,uoftemp.readp,uoftemp.writep); printf(%sn, 输入用户已开文件表结束。); diskh=0; diskt=399; while(1) printf(%sn, 请输入用户名); scanf(%s,mun); uno=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - while(
28、unoucounter)&(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!=()& (michlen) instsmi=instmi;mi+; instsmi=0; / printf(!n); / printf(%sn,insts); mmi=0; while(mmi=7
29、)&(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,
30、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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
31、第 10 页,共 11 页 - - - - - - - - - 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;
32、 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -