1、模拟文件系统的设计与实现模拟文件系统的设计与实现中北大学操作系统课程设计说 明 书学 院、系:软件学院专 业:软件工程学 生 姓 名:xxx学 号:xxx设 计 题 目:模拟文件系统的设计与实现起 迄 日 期: 12月28日- 1月8日指 导 教 师:xxx 年1月8日1需求分析 经过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时经过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系
2、统的课程设计目的是经过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。2总体设计 结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。文件的创立: create 文件关闭:close 文件的打开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创立子目录:mkdir 删除子目录:rmdir列出文件目录:dir 退出:exit系统执行流程图 3详细设计主要数据结构:#define MEM_D_SIZE 1024*1024 /总磁盘空间为1M#define DIS
3、KSIZE 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 /路径最大长度为1KB#define MSD 5 /最大子目录数5#define MOFN 5 /最大文件深度为5#define MAX_W
4、RITE 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; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录 起始盘块号*/ int next; /*子目录起始盘块号*/
5、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; if(strlen(name)8) /*文件名大于 8位*/ return(-1); for(j=2;jdirectitemj.n
6、ame,name) break; if(jMSD+2) /*文件已经存在*/ return(-4); for(i=2;idirectitemi.firstdisk=-1) break; if(i=MSD+2) /*无空目录项*/ return(-2); if(u_opentable.cur_size=MOFN) /*打开文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;j=DISK_NUM) return(-5); fatj.em_disk = 1; /*将空闲块置为已经分配*/ /*-填写目录项-*/ strcpy(cur_dir-directitemi.nam
7、e,name); cur_dir-directitemi.firstdisk = j; cur_dir-directitemi.size = 0; cur_dir-directitemi.next = j; cur_dir-directitemi.property = 0; /*-*/ fd = open(name); return 0; int open(char *name) int i, j; for(i=2;idirectitemi.name,name) break; if(i=MSD+2) return(-1); /*-是文件还是目录-*/ if(cur_dir-directitem
8、i.property=1) return(-4); /*-文件是否打开-*/ for(j=0;jMOFN;j+) if(!strcmp(u_opentable.openitemj.name,name) break; if(j=MOFN) /*文件打开太多*/ return(-3); /*-查找一个空闲用户打开表项-*/ for(j=0;jdirectitemi.firstdisk; strcpy(u_opentable.openitemj.name,name); u_opentable.openitemj.size = cur_dir-directitemi.size; u_opentable
9、.cur_size+; /*-返回用户打开表表项的序号-*/ return(j); int close(char *name) int i; for(i=0;i=MOFN) return(-1); /*-清空该文件的用户打开表项的内容-*/ strcpy(u_opentable.openitemi.name,); u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size-; return 0; int write(int fd, char *buf, int len) c
10、har *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*-用 $ 字符作为空格 # 字符作为换行符-*/ char Space = 32; char Endter= n; for(i=0;ilen;i+) if(bufi = $) bufi = Space; else if(bufi = #) bufi = Endter; /*-读取用户打开表对应表项第一个盘块号-*/ item = u_opentable.openitemfd.firstdisk; /*-找到当前目录所对应表项的序号-*/ for(i=2;idirec
11、titemi.firstdisk=item) break; temp = i; /*-存放当前目录项的下标-*/ /*-找到的item 是该文件的最后一块磁盘块-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找该文件的下一盘块-*/ /*-计算出该文件的最末地址-*/ first = fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE; /*-如果最后磁盘块剩余的大小大于要写入的文件的大小-*/ if(DISKSIZE-u_opentable.openitemfd.size%D
12、ISKSIZElen) 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;i0) ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/ for(j=0;jilen2;j+) for(i=ROOT_DISK_NO+1;i=DISK_NUM) /*-如果磁盘块已经分配完了-*/ return(-1); first = fdi
13、sk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一块-*/ for(k=0;klen-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+) firstk = bufk; else/*-如果不是要最后分配的一块-*/ for(k=0;kdirectitemtemp.size = cur_dir-directitemtemp.size+len; return 0; int read(int fd, char *buf) int len = u_ope
14、ntable.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; /*-计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/ for(i=0;iilen1;i+) if(i=ilen1-1) /*-如果在最后一个磁盘块-*
15、/ for(j=0;jlen-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; else /*-不在最后一块磁盘块-*/ for(j=0;jlen-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; item = fatitem.item; /*-查找下一盘块-*/ first = fdisk+item*DISKSIZE; return 0; int del(char *name) int i,cur_item,item,temp; for(i=2;idirectitemi.name,name) break; cur_item =
16、i; /*-用来保存目录项的序号,供释放目录中-*/ if(i=MSD+2) /*-如果不在当前目录中-*/ return(-1); if(cur_dir-directitemcur_item.property!=0) /*-如果删除的(不)是目录-*/ return(-3); for(i=0;idirectitemcur_item.firstdisk;/*-该文件的起始盘块号-*/ while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = 0; item
17、= temp; /*-释放目录项-*/ cur_dir-directitemcur_item.sign = 0; cur_dir-directitemcur_item.firstdisk = -1; strcpy(u_opentable.openitemcur_item.name,); cur_dir-directitemcur_item.next = -1; cur_dir-directitemcur_item.property = 0; cur_dir-directitemcur_item.size = 0; return 0; 主函数:int main() FILE *fp; char
18、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); scanf(%c,&ch); if(ch=y) initfile(); printf(Successfully format! n); else return 0; enter()
19、; print(); show(); strcpy(code0,exit); strcpy(code1,create); strcpy(code2,open); strcpy(code3,close); strcpy(code4,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;i11;i+) if(!strcmp(codei,a)
20、break; switch(i) case 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 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,name); fd = open(name);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1