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

下载本文档

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

文档简介

1、I北大学操作系统课程设计软件学院业:软件工程名:XXX学号:XXX模拟文件系统的设计与实现2015年12月28日-2016年1月8日XXX2016年1月8日1需求分析,加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识系统地提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。模拟二级文件管理系统的课程设计目的是通过研究LinUX的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。

2、2 总体设计结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。文件的创建:create文件关闭:close文件的打开:open文件的读:read文件的写:write文件关闭:close删除文件:delete创建子目录:mkdir删除子目录:rmdir列出文件目录:dir退出:exit系统执行流程图退出int size; /*文件/目录字节数、盘块数)*/3.详细设计总磁盘空间为1M主要数据结构:#defi ne MEM_D_SIZE 1024*1024 /#defi ne DISKSIZE 1024/磁盘块的大小1K#defi ne DISK_NUM 1

3、024/磁盘块数目1K#defi ne FATSIZE DISK_NUM*sizeof(struct fatitem)/FAT表大小#defi ne ROOT_DISK_NO FATSIZE/DISKSIZE+1/根目录起始盘块号#defi ne ROOT_DISK_SIZE sizeof(struct direct)/根目录大小#defi ne DIR_MAXSIZE 1024/路径最大长度为1KB#defi ne MSD 5/最大子目录数5#defi ne MOFN 5/最大文件深度为5#defi ne MAX_WRITE 1024*128/最大写入文字长度 128KBstruct fat

4、item /* size 8*/0空闲*/int item; /*存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位;struct direct/*文件控制快信息-*/struct FCBchar n ame9; /*文件/目录名8位*/char prop erty; /*属性1位目录0位普通文件*/int firstdisk; /*文件/目录起始盘块号*/int n ext; /*子目录起始盘块号*/int sig n; /*1是根目录0不是根目录*/directitemMSD+2;; struct open tablestruct open ttableite

5、mchar n ame9; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/openi temMOFN;int cur_size; /*当前打文件的数目*/;管理文件的主要代码:int create(char *n ame)int i,j;if(strle n(n ame)8) /*文件名大于8位*/return(-1);for(j=2;jdirectitemj. name ,n ame)break;if(jMSD+2) /*文件已经存在*/return(-4);for(i=2;idirectitemi. name ,n ame);if(cu

6、r_dir-directitemi.firstdisk=-1)break;if(i=MSD+2) /* 无空目录项 */打开文件太多*/return(-2);if(u_o pen table.cur_size=MOFN) /*return(-3);for(j=ROOT_DISK_NO+1;j=DISK_NUM)return(-5);fatj.em_disk = 1; /*将空闲块置为已经分配*/*填写目录项*/cur_dir-directitemi.firstdisk = j;cur_dir-directitemi.size = 0;cur_dir-directitemi. next = j;

7、cur_dir-directitemi. prop erty = O;/*/fd = open(n ame);return 0;int open( char *n ame)int i, j;for(i=2;idirectitemi. name, name)break;if(i=MSD+2)return(-1);/*是文件还是目录*/if(cur_dir-directitemi. prop erty=1)return(-4);/*文件是否打开*/for(j=0;jMOFN;j+)break;if(j=MOFN) /*文件打开太多*/return(-3);if(!strcm p(u_open ta

8、ble. open itemi. name ,n ame)return(-1);/*查找一个空闲用户打开表项*/for(j=0;jdirectitemi.firstdisk;strc py(u_open table. open itemj. name ,n ame);u_open table. open itemj.size = cur_dir-directitemi.size;u_open table.cur_size+;/*返回用户打开表表项的序号*/return(j);int close(char *n ame)int i;for(i=0;i=MOFN)/*清空该文件的用户打开表项的内容

9、*/strc py(u_open table. open itemi. name,);u_open table. open itemi.firstdisk = -1;u_open table. open itemi.size = 0;u_open table.cur_size-;return 0;int write(i nt fd, char *buf, i nt len)char *first;int item, i, j, k;int ile n1, ile n2, modle n, temp;/*用$字符作为空格#字符作为换行符*/char Space = 32;char En dter

10、= n;for(i=0;ile n;i+)if(bufi = $)bufi = Space;else if(bufi = #)bufi = En dter;/*读取用户打开表对应表项第一个盘块号*/item = u_open table. open itemfd.firstdisk;/*计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储for(i=2;idirectitemi.firstdisk=item)break;temp = i; /*- 存放当前目录项的下标-*/*找到的item是该文件的最后一块磁盘块*/查找该文件的下一盘块-*/while(fatitem.item!=-1

11、)item =fatitem.item; /*-/*计算出该文件的最末地址*/first = fdisk+item*DISKSIZE+u_o pen table.o pen itemfd.size%DISKSIZE;/*如果最后磁盘块剩余的大小大于要写入的文件的大小*/if(DISKSIZE-u_o pen table.o pen itemfd.size%DISKSIZEle n)strc py (first,buf);u_open table. open itemfd.size = u_open table. open itemfd.size+le n;cur_dir-directitemt

12、e mp .size = cur_dir-directitemte mp .size+le n;elsefor(i=0;i0)ilen2 = ile n2+1; /*-还需要多少块磁盘块-*/找到的那块空闲磁盘块的起始地址-*/if(j=ile n2-1)/*-如果是最后要分配的一块-*/for(j=0;jile n2;j+)for(i=ROOT_DISK_NO+1;i=DISK_NUM) /*-如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*-k+)firstk = bufk;else/*-如果不是要最后分配的一块-*/for(k=0

13、;kDISKSIZE;k+)firstk =bufk;for(k=0;kdirectitemte mp .size = cur_dir-directitemte mp .size+le n;return 0;int read(i nt fd, char *buf)int len = u_open table. open itemfd.size;char *first;int i, j, item;int ile n1, modle n;item = u_open table. open itemfd.firstdisk;ilen1 = len/DISKSIZE;modle n = len %D

14、ISKSIZE;if(modle n!=0)ilen1 = ilen 1+1; /*-计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/for(i=0;iile n1;i+)if(i=ile n1-1)/*-如果在最后一个磁盘块-*/for(j=0;jle n-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;else /*-不在最后一块磁盘块-*/for(j=0;jle n-i*DISKSIZE;j+)bufi*DISKSIZE+j = firsts;item = fatitem.item; /*-

15、查找下一盘块-*/return 0;first = fdisk+item*DISKSIZE;int del(char *n ame)int i,cur_item,item,te mp;for(i=2;idirectitemi. name, name)break;cur_iitem = i; /*-用来保存目录项的序号,供释放目录中-*/if(i=MSD+2) /*-如果不在当前目录中-*/return(-1);如果删除的(不)是目录-*/for(i=0;idirectitemcur_item. prop erty!=O) /*-return(-3);if(!strcm p(u_open tab

16、le. open itemi. name ,n ame)该文件的起始盘块号-*/return(-2);item = cur_dir-directitemcur_item.firstdisk;/*-while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/temp = fatitem.item;fatitem.item = -1;fatitem.em_disk = 0;item = temp;/*释放目录项*/cur_dir-directitemcur_item.sig n = 0;cur_dir-directitemcur_item.firstdisk = -1;strc

17、py(u_open table. open itemcur_item. name,);cur_dir-directitemcur_item. next = -1;cur_dir-directitemcur_item. property = 0;cur_dir-directitemcur_item.size = 0;return 0;主函数:int mai n()FILE *fp;char ch;char a100;char code1110;char n ame10;int i,flag,r_size;char *con tect;con tect = (char *)malloc(MAX_W

18、RITE*sizeof(char);if(fp=fo pen( disk.dat,rb)=NULL)prin tf(You have not format,Do you want format?(y/n);scan f(%c,&ch);if(ch=y)in itfile();prin tf(Successfully format! n);elsereturn 0;prin t();show();en ter();strc py(code0,exit);strc py(code1,create);strc py (code2, open);strc py(code3,close);strc py

19、(code4,wnte);strc py (code5,read);strcpy(code6,del);strc py(code7,mkdir);strc py(code8,rmdir);strc py(code9,dir);strc py(code10,cd);while(1)scan f(%s,a);for(i=0;i11;i+)if(!strcm p( codei,a)break;switch(i) case 0: / 退出文件系统free(c on tect);return 0;case 1: II创建文件sca nf(%s, name);halt();flag = create( n

20、ame);prin tf(Error: n The len gth is too long !n);if(flag=-1) else if(flag=-2)prin tf(Error: n The direct item is already full !n);else if(flag=-3)prin tf(Error: n The nu mber of open file is too much !n);else if(flag=-4)prin tf(Error: n The n ame is already in the direct !n);else if(flag=-5)prin tf

21、(Error: n The disk space is full!n);elseprin tf(Successfully create a file! n);break;case 2:/ 打开文件sca nf(%s, name);show();prin tf(Error: n The open file not exit! n);fd = open(n ame);if(fd = -1) else if(fd = -2)prin tf(Error: n The file have already open ed! n);else if(fd = -3)prin tf(Error: n The n

22、u mber of open file is too much! n);else if(fd = -4)prin tf(Error: n It is a direct,ca n not open for read or write!n);elseprin tf(Successfully open ed! n);show();break;case 3:/ 关闭文件sca nf(%s, name);flag = close( name);if(flag = -1)prin tf(Error:n The file is not opened ! n);elseprin tf(Successfully

23、 closed! n);show();break;case 4:/ 写文件if(fd =-1)prin tf(Error:n The file is not opened ! n);elseprintfCP lease input the file con tect:);scan f(%s,co ntect);flag=write(fd,c on tect,strle n(con tect);if(flag = 0)prin tf(Successfully write! n);elseprin tf(Error:n The disk size is not eno ugh! n);show();break;prin tf(Error:n The file is not opened ! n);case 5:11读文件if(fd =-1) elseflag

温馨提示

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

评论

0/150

提交评论