logo资料库

操作系统文件系统实验报告.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
操作系统试验
班级:计科0801 姓名:韩伟伟 学号:08407106 日期:2011/6/15
实验六 模拟实现文件系统
操作系统试验 班级:计科 0801 姓名:韩伟伟 学号:08407106 日期:2011/6/15 实验六 模拟实现文件系统 一.实验目的 通过模拟程序实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能,了解 文件系统实现的特点,掌握文件系统的各种功能实现方法。 二.实验属性 设计 三.实验内容 模拟实现文件系统问题是一个经典的关于文件的处理问题,包括:实现文件的建立、 打开、删除、关闭、复制、读、写、查询等功能。设计思想如下: 1. 在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目 录的文件系统。 2. 文件物理结构可采用显式链接或其他方法。 3. 磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存 储空间,并采用显式链接分配方式,则可以将位示图合并到 FAT 中。 4. 文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、 长度等信息,还可以通过目录项实现对文件的读和写的保护。目录组织方式可以不使用 索引结点的方式,但使用索引结点,则难度系数为 1.2。 5. 设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作: (1)具有 login (用户登录) (2)系统初始化(建文件卷、提供登录模块) (3)文件的创建: create (4)文件的打开:open (5)文件的读:read (6)文件的写:write (7)文件关闭:close (8)删除文件:delete (9)列出文件目录:dir (10)退出:logout 四.设计思路 1.本系统初始化了十个用户,每个用户初始化五个文件,最多可拥有十个文件,所以 每个用户在此基础上可为自己再创建五个文件,也可以在删除文件后再创建。 2.系统使用 create,open,read,write,close,delete,dir 和 exit 来创建文件, 打开文件,读文件,写文件,关闭文件,删除文件和显示文件。 3.程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打
开文件设置了运行文件目录(AFD)。 4.为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并 不进行实际的读写操作。 模拟实现文件系统的主要流程图如下: 五.实验报告 1.写出你编写的 C++程序。 #include "stdio.h" #include #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 #define UserNumber 10 #define UserFNumber 10 #define UserOFNumber 5 struct fname{ char fnamea[1]; int flag; } fnameA[26]={'a',0,'b',0,'c',0,'d',0,'e',0,'f',0,'g',0,'h',0,'i',0,'j',0,'k',0,'l',0,
'm',0,'n',0,'o',0,'p',0,'q',0,'r',0,'s',0,'t',0,'u',0,'v',0,'w',0,'x',0,'y',0,'z',0}; struct afd { char opname[10];/* 打开文件名 */ int flag; char opfprotect[3];/* 打开保护码 */ int rwpoint;/* 读写指针 */ } AFD[UserOFNumber];/* 用户打开的文件 */ typedef struct { char fname[10];/* 用户文件名 */ int flag;/* 文件存在标志 */ int int } ufd,UF[UserFNumber];/* 用户文件 */ fprotect[3];/* 文件保护码 r\w\t */ flength; char uname[10];/* 用户名 */ UF Udir;/* 用户文件目录 */ } UFD[UserNumber];/* 用户 */ struct mdf { void intFSystem(){ int i,j,k,l; strcpy(UFD[0].uname,"a"); strcpy(UFD[1].uname,"b"); strcpy(UFD[2].uname,"c"); strcpy(UFD[3].uname,"d"); strcpy(UFD[4].uname,"e"); strcpy(UFD[5].uname,"f"); strcpy(UFD[6].uname,"g"); strcpy(UFD[7].uname,"h"); strcpy(UFD[8].uname,"i"); strcpy(UFD[9].uname,"j"); for(i=0;i<10;i++) { for(k=0;k<5;k++){ do j=rand()%26; while(fnameA[j].flag); strcpy(UFD[i].Udir[k].fname,fnameA[j].fnamea); fnameA[j].flag=1; UFD[i].Udir[k].flength=rand()%2048+1; UFD[i].Udir[k].flag=1; UFD[i].Udir[k].fprotect[0]=rand()%2; UFD[i].Udir[k].fprotect[1]=rand()%2; UFD[i].Udir[k].fprotect[2]=rand()%2; } for(j=0;j<26;j++) fnameA[j].flag=0; } for(l=0;l<5;l++){ strcpy(AFD[i].opname,"");
AFD[l].flag=0; AFD[l].opfprotect[0]=0; AFD[l].opfprotect[1]=0; AFD[l].opfprotect[2]=0; AFD[l].rwpoint=0; } } void Open(int i){ int l,k,n; char file[10]; for(l=0;l<5;l++) { if(!AFD[l].flag) break; } printf("请输入你想打开的文件名:"); scanf("%s",file); for(n=0;n<5;n++) if(!strcmp(AFD[n].opname,file)&&AFD[n].flag) {printf("he file had opened!\n",file);return;} for(k=0;k<10;k++) if(!strcmp(UFD[i].Udir[k].fname,file)&&UFD[i].Udir[k].flag) { strcpy(AFD[l].opname,UFD[i].Udir[k].fname); AFD[l].opfprotect[0]=UFD[i].Udir[k].fprotect[0]; AFD[l].opfprotect[1]=UFD[i].Udir[k].fprotect[1]; AFD[l].opfprotect[2]=UFD[i].Udir[k].fprotect[2]; AFD[l].flag=1; printf("文件已打开!\n"); return;} printf("文件不存在!\n"); return; } void Create(int i){ int k; } for(k=0;k<10;k++) {if(!UFD[i].Udir[k].flag) break; if(k>=10) {printf("一个用户不能拥有超过 10 个文件\n\n");return;} printf("请输入你想创建的文件名:"); scanf("%s",UFD[i].Udir[k].fname); printf("请输入文件长度:"); scanf("%d",&UFD[i].Udir[k].flength); printf("只读?(1 yes,0 no):"); scanf("%d",&UFD[i].Udir[k].fprotect[0]); printf("可写?(1 yes,0 no):"); scanf("%d",&UFD[i].Udir[k].fprotect[1]); printf("可执行?(1 yes,0 no):"); scanf("%d",&UFD[i].Udir[k].fprotect[2]); UFD[i].Udir[k].flag=1; return;} void Delete(int i){char file[10]; int k; printf("请输入你想删除的文件名:"); scanf("%s",file);
for(k=0;k<10;k++) { if(UFD[i].Udir[k].flag&&!strcmp(UFD[i].Udir[k].fname,file)) { printf("文件已删除!\n"); UFD[i].Udir[k].flag=0;break;} else if(!UFD[i].Udir[k].flag&&!strcmp(UFD[i].Udir[k].fname,file)) printf("文件不存在!\n"); } return;} void Read(){ int l;char file[10]; printf("请输入你想读的文件:"); scanf("%s",file); for(l=0;l<5;l++) if(!strcmp(AFD[l].opname,file)&&AFD[l].flag) if(AFD[l].opfprotect[0]){ printf("the file has read.\n"); return;}else {printf("cannot read!\n"); return;} if(l>=5) printf("文件尚未打开,请先打开文件\n"); return;} void Write(){ int l;char file[10]; printf("请输入你想写的文件:"); scanf("%s",file); for(l=0;l<5;l++) if(!strcmp(AFD[l].opname,file)&&AFD[l].flag) has if(AFD[l].opfprotect[1]){ file printf(" the written.\n"); return;}else{ printf("cannot write !\n"); return;} if(l>=5) printf("文件尚未打开,请先打开文件\n"); return;} void printUFD(int i){int k; printf("主文件目录:\n",UFD[i].uname); printf("用户名\t 文件名\t 可读 可写 可执行\t 文件长度\n"); for(k=0;k<10;k++){ if(UFD[i].Udir[k].flag) printf("%s\t%s\t%d dir[k].fprotect[0], %d %d\t\t%dB\n",UFD[i].uname,UFD[i].Udir[k].fname,UFD[i].U UFD[i].Udir[k].fprotect[1],UFD[i].Udir[k].fprotect[2],UFD[i].Udir[k].flength); } } void printAFD(int i) { int l,k; if (!AFD[0].flag&&!AFD[1].flag&&!AFD[2].flag&&!AFD[3].flag&&!AFD[4].flag) { } printf("当前没有运行的文件!\n"); return;
else { printf("运行文件目录:\n"); printf("文件名\t 可读 可写 可执行\n"); for(l=0;l<5;l++) { for(k=0;k<10;k++) { if(!strcmp(UFD[i].Udir[k].fname,AFD[l].opname)&&UFD[i].Udir[k].flag&&AFD[l].flag){ break; } else continue; } if(!strcmp(UFD[i].Udir[k].fname,AFD[l].opname)&&UFD[i].Udir[k].flag&&AFD[l].flag) { printf("%s\t%d %d\n",AFD[l].opname,AFD[l].opfprotect[0],AFD[l].opfprot %d ect[1],AFD[l].opfprotect[2]); } } } } void Close(){ int l; char file[10]; printf("请选择文件:"); scanf("%s",file); for(l=0;l<5;l++) if(!strcmp(AFD[l].opname,file)&&AFD[l].flag) close\n");return;} if(l>=5) printf("文件打开失败!\n"); return;} void main(){ int i,n=0; {AFD[l].flag=0;printf("the file has char m[10]; char login[10]; intFSystem(); printf(" printf("1.本系统模拟文件管理 2.系统已初始化 10 个用户,\n 用户名分别是 欢迎使用\n"); a~j,每个用户已分配五个文件\n"); printf("**本系统的命令包括如下:\n"); printf("**创建文件(create)\n"); printf("**删除文件(delete)\n"); printf("**打开文件(open)\n"); printf("**关闭文件(close)\n"); printf("**读取文件(read)\n"); printf("**编写文件(write)\n"); printf("**显示文件目录(printufd)\n");
printf("**显示打开文件目录(dir)\n"); printf("**退出(exit)\n"); lgin: printf("请输入用户名(a~j):"); scanf("%s",login); if(!strcmp(login,"exit")) return; for(i=0;i<10;i++){ if(!strcmp(UFD[i].uname,login)) break;} if(i>=10){ printf("该用户名不存在!"); goto lgin; } printUFD(i); for(;n!=1;){ printf("请输入命令:"); scanf("%s",&m); if(strcmp(m,"create")==0) Create(i); else if(strcmp(m,"delete")==0) Delete(i); else if(strcmp(m,"open")==0) Open(i); else if(strcmp(m,"close")==0) Close(); else if(strcmp(m,"read")==0) Read(); else if(strcmp(m,"write")==0) Write(); else if(strcmp(m,"printufd")==0) printUFD(i); else if(strcmp(m,"dir")==0) printAFD(i); else if(strcmp(m,"exit")==0) n=1; else printf("出错\n"); } printf("Saving....\n"); printUFD(i); getch(); return; } 用户登录时的界面如下: 用户对此模拟系统进行各项操作的界面如下:
2.描述文件系统的实现原理 本系统是模拟实现多用户多目录的文件系统(10 个用户),在系统出现登录 后 ,输入用户名,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指 定的文件中。系统的命令与其命令的具体实现,此模拟系统共提供了 9 条基本命 令,并根据命令的含义与要求,用 C++编程来完成所有具体操作。该系统可以模拟 完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件, 删除文件和退出系统等功能。 3. 总结体会 通过本次试验使我对文件系统的理解更深了一个层次,全面了解了计算机是 如何管理文件的。另一方面,通过对文件系统的设计也使我对 C++的编程能力有 了提高。
分享到:
收藏