模拟文件系统的设计与实现_第1页
模拟文件系统的设计与实现_第2页
模拟文件系统的设计与实现_第3页
模拟文件系统的设计与实现_第4页
模拟文件系统的设计与实现_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中北高校操作系统课程设计说 明 书 学 院、系:软件学院专 业:软件工程学 生 姓 名:xxx学 号:xxx设 计 题 目:模拟文件系统的设计与实现起 迄 日 期:2015年12月28日- 2016年1月8日指 导 教 师:xxx    2016 年1月8日1 需求分析 通过模拟文件系统的实现,深化理解操作系统中文件系统的理论学问, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地把握操作系统的原理及实现方法,提高综合运用各专业课学问的力量;把握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的进展动

2、向和趋势。 模拟二级文件管理系统的课程设计目的是通过争辩Linux的文件系统结构,模拟设计一个简洁的二级文件系统,第一级为主名目文件,其次级为用户文件。2 总体设计 结合数据结构、程序设计、计算机原理等课程的学问,设计一个二级文件系统,进一步理解操作系统。文件的创建: create 文件关闭:close 文件的打开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创建子名目:mkdir 删除子名目:rmdir列出文件名目:dir 退出:exit开 始系统执行流程图选择操作创建文件删除文件读文件写文件创建文件夹删除文件夹删除子名目显示当前子名目创建子

3、名目更改名目 退出退出3 具体设计主要数据结构:#define MEM_D_SIZE 1024*1024 /总磁盘空间为1M#define DISKSIZE 1024/磁盘块的大小1K#define DISK_NUM 1024/磁盘块数目1K#define FATSIZE DISK_NUM*sizeof(struct fatitem)/FAT表大小#define ROOT_DISK_NO FATSIZE/DISKSIZE+1/根名目起始盘块号#define ROOT_DISK_SIZE sizeof(struct direct)/根名目大小#define DIR_MAXSIZE 1024/路径

4、最大长度为1KB#define MSD 5/最大子名目数5#define MOFN 5/最大文件深度为5#define MAX_WRITE 1024*128/最大写入文字长度128KB struct fatitem /* size 8*/ int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ ; struct direct /*-文件把握快信息-*/ struct FCB char name9; /*文件/名目名 8位*/ char property; /*属性 1位名目 0位一般文件*/ int size; /*文件/名目字

5、节数、盘块数)*/ int firstdisk; /*文件/名目 起始盘块号*/ int next; /*子名目起始盘块号*/ int sign; /*1是根名目 0不是根名目*/ directitemMSD+2; ; struct opentable struct openttableitem char name9; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ openitemMOFN; int cur_size; /*当前打文件的数目*/ ; 管理文件的主要代码:int create(char *name) int i,j; i

6、f(strlen(name)>8) /*文件名大于 8位*/ return(-1); for(j=2;j<MSD+2;j+) /*检查创建文件是否与已存在的文件重名*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*文件已经存在*/ return(-4); for(i=2;i<MSD+2;i+) /*找到第一个空闲子名目*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*无空名目项*/ return

7、(-2); if(u_opentable.cur_size>=MOFN) /*打开文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;j<DISK_NUM;j+) /*找到空闲盘块 j 后退出*/ if(fatj.em_disk='0') break; if(j>=DISK_NUM) return(-5); fatj.em_disk = '1' /*将空闲块置为已经安排*/ /*-填写名目项-*/ strcpy(cur_dir->,name); cur_dir->direc

8、titemi.firstdisk = j; cur_dir->directitemi.size = 0; cur_dir->directitemi.next = j; cur_dir->perty = '0' /*-*/ fd = open(name); return 0; int open(char *name) int i, j; for(i=2;i<MSD+2;i+) /*文件是否存在*/ if(!strcmp(cur_dir->,name) break; if(i>=MSD

9、+2) return(-1); /*-是文件还是名目-*/ if(cur_dir->perty='1')return(-4); /*-文件是否打开-*/ for(j=0;j<MOFN;j+) if(!strcmp(u_,name) break; if(j<MOFN) /*文件已经打开*/ return(-2); if(u_opentable.cur_size>=MOFN) /*文件打开太多*/ return(-3); /*-查找一个空闲用户打开表项-*/ for(j=0;j&l

10、t;MOFN;j+) if(u_opentable.openitemj.firstdisk=-1) break; /*-填写表项的相关信息-*/ u_opentable.openitemj.firstdisk = cur_dir->directitemi.firstdisk; strcpy(u_,name); u_opentable.openitemj.size = cur_dir->directitemi.size; u_opentable.cur_size+; /*-返回用户打开表表项的序号-*/ return(j); int c

11、lose(char *name) int i; for(i=0;i<MOFN;i+) if(!strcmp(u_,name) break; if(i>=MOFN) return(-1); /*-清空该文件的用户打开表项的内容-*/ strcpy(u_,""); u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size-; return 0; in

12、t write(int fd, char *buf, int len) char *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*-用 $ 字符作为空格 # 字符作为换行符-*/ char Space = 32; char Endter= 'n' for(i=0;i<len;i+) if(bufi = '$') bufi = Space; else if(bufi = '#') bufi = Endter; /*-读取用户打开表对应表项第一个盘块号-*/ item =

13、 u_opentable.openitemfd.firstdisk; /*-找到当前名目所对应表项的序号-*/ for(i=2;i<MSD+2;i+) if(cur_dir->directitemi.firstdisk=item) break; temp = i; /*-存放当前名目项的下标-*/ /*-找到的item 是该文件的最终一块磁盘块-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找该文件的下一盘块-*/ /*-计算出该文件的最末地址-*/ first = fdisk+item*DISKSIZE+u_opentabl

14、e.openitemfd.size%DISKSIZE; /*-假如最终磁盘块剩余的大小大于要写入的文件的大小-*/ if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE>len) strcpy(first,buf); u_opentable.openitemfd.size = u_opentable.openitemfd.size+len; cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len; else for(i=0;i<(DISKSIZE-u_op

15、entable.openitemfd.size%DISKSIZE);i+) /*写一部分内容到最终一块磁盘块的剩余空间(字节)*/ firsti = buf i; /*-计算安排完最终一块磁盘的剩余空间(字节) 还剩下多少字节未存储-*/ ilen1 = len-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE); ilen2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen>0) ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/ for(j=0;j<ilen2;j+

16、) for(i=ROOT_DISK_NO+1;i<DISK_NUM;i+)/*查找空闲磁盘块*/ if(fati.em_disk='0') break; if(i>=DISK_NUM) /*-假如磁盘块已经安排完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/ if(j=ilen2-1) /*-假如是最终要安排的一块-*/ for(k=0;k<len-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+) fir

17、stk = bufk; else/*-假如不是要最终安排的一块-*/ for(k=0;k<DISKSIZE;k+) firstk =bufk; fatitem.item = i; /*-找到一块后将它的序号存放在上一块的指针中-*/ fati.em_disk = '1' /*-置找到的磁盘快的空闲标志位为已安排-*/ fati.item = -1; /*-它的指针为 -1 (即没有下一块)-*/ /*-修改长度-*/ u_opentable.openitemfd.size = u_opentable.openitemfd.size+len; cur_dir->dir

18、ectitemtemp.size = cur_dir->directitemtemp.size+len; return 0; int read(int fd, char *buf) int len = u_opentable.openitemfd.size; char *first; int i, j, item; int ilen1, modlen; item = u_opentable.openitemfd.firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*

19、-计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/ for(i=0;i<ilen1;i+) if(i=ilen1-1) /*-假如在最终一个磁盘块-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; else /*-不在最终一块磁盘块-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; item = fatitem.item; /*-查找下一盘块-*/ first = fdisk+

20、item*DISKSIZE; return 0; int del(char *name) int i,cur_item,item,temp; for(i=2;i<MSD+2;i+) /*-查找要删除文件是否在当前名目中-*/ if(!strcmp(cur_dir->,name) break; cur_item = i; /*-用来保存名目项的序号,供释放名目中-*/ if(i>=MSD+2) /*-假如不在当前名目中-*/ return(-1); if(cur_dir->directitemcur_perty!='

21、0') /*-假如删除的(不)是名目-*/ return(-3); for(i=0;i<MOFN;i+) /*-假如文件打开,则不能删除,退出-*/ if(!strcmp(u_,name) return(-2); item = cur_dir->directitemcur_item.firstdisk;/*-该文件的起始盘块号-*/ while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk =

22、'0' item = temp; /*-释放名目项-*/ cur_dir->directitemcur_item.sign = 0; cur_dir->directitemcur_item.firstdisk = -1; strcpy(u_opentable.openitemcur_,""); cur_dir->directitemcur_item.next = -1; cur_dir->directitemcur_perty = '0' cur_dir->directitemc

23、ur_item.size = 0; return 0; 主函数:int main() FILE *fp; char ch; char a100; char code1110; char name10; int i,flag,r_size; char *contect; contect = (char *)malloc(MAX_WRITE*sizeof(char); if(fp=fopen("disk.dat","rb")=NULL) printf("You have not format,Do you want format?(y/n)&quo

24、t;); scanf("%c",&ch); if(ch='y') initfile(); printf("Successfully format! n"); else return 0; enter();print(); show(); strcpy(code0,"exit"); strcpy(code1,"create"); strcpy(code2,"open"); strcpy(code3,"close"); strcpy(code4,"

25、;write"); strcpy(code5,"read"); strcpy(code6,"del"); strcpy(code7,"mkdir"); strcpy(code8,"rmdir"); strcpy(code9,"dir"); strcpy(code10,"cd"); while(1) scanf("%s",a); for(i=0;i<11;i+) if(!strcmp(codei,a) break; switch(i) cas

26、e 0: /退出文件系统free(contect); halt(); return 0; case 1: /创建文件scanf("%s",name); flag = create(name); if(flag=-1) printf("Error: n The length is too long !n"); else if(flag=-2) printf("Error: n The direct item is already full !n"); else if(flag=-3) printf("Error: n The

27、number of openfile is too much !n"); else if(flag=-4) printf("Error: n The name is already in the direct !n"); else if(flag=-5) printf("Error: n The disk space is full!n"); else printf("Successfully create a file! n"); show(); break; case 2:/打开文件scanf("%s"

28、;,name); fd = open(name); if(fd = -1) printf("Error: n The open file not exit! n"); else if(fd = -2) printf("Error: n The file have already opened! n"); else if(fd = -3) printf("Error: n The number of open file is too much! n"); else if(fd = -4) printf("Error: n It

29、 is a direct,can not open for read or write! n"); else printf("Successfully opened! n"); show(); break; case 3:/关闭文件 scanf("%s",name); flag = close(name); if(flag = -1) printf("Error:n The file is not opened ! n"); else printf("Successfully closed! n"); show(); break; case 4:/写文件if(fd =-1) printf("Error:n The file is not opened ! n"); else printf("Please input the file contect:"); scanf("%s",contect); flag=write(fd,contect,strlen(contect); if(flag = 0) printf("Successfully write! n"); else pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论