操作系统文件管理系统模拟实验_第1页
操作系统文件管理系统模拟实验_第2页
操作系统文件管理系统模拟实验_第3页
操作系统文件管理系统模拟实验_第4页
操作系统文件管理系统模拟实验_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、文件管理系统模拟1 .实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2 .实验内容为Linux系统设计一个简单的二级文件系统。要求做到以下几点:(1)可以实现下列几条命令(至少4条)login用户登录dir列文件目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。3 .实验提小(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。(2)用户创建的文件,可

2、以编号存储于磁盘上。入file0,file1,file2并以编号作为物理地址,在目录中进行登记。4.源代码#include#include#include#defineMEM_D_SIZE1024*1024/总磁盘空间为1M#defineDISKSIZE1024磁盘块的大小1K#defineDISK_NUM1024磁盘块数目1K#defineFATSIZEDISK_NUM*sizeof(structfatitem)/FAT表大小#defineROOT_DISK_NOFATSIZE/DISKSIZE+1/根目录起始盘块号#defineROOT_DISK_SIZEsizeof(structdire

3、ct)/根目录大小#defineDIR_MAXSIZE1024/路径最大长度为1KB#defineMSD5/最大子目录数5#defineMOFN5/最大文件深度为5#defineMAX_WRITE1024*128/最大后入文字长度128KBstructfatitem/*size8*/intitem;/*存放文件下一个磁盘的指针*/charem_disk;/*磁盘块是否空闲标志位0空闲*/;structdirect/*-文件控制快信息-*/structFCBcharname9;/*文件/目录名8位*/charproperty;/*属性1位目录0位普通文件*/intsize;/*文件/目录字节数、

4、盘块数)*/intfirstdisk;/*文件/目录起始盘块号*/intnext;/*子目录起始盘块号*/intsign;/*1是根目录0不是根目录*/directitemMSD+2;structopentablestructopenttableitemcharname9;/*文件名*/intfirstdisk;/*起始盘块号*/intsize;/*文件的大小*/openitemMOFN;intcur_size;/*当前打文件的数目*/;structfatitem*fat;/*FAT表*/structdirect*root;/*根目录*/structdirect*cur_dir;/*当前目录*

5、/一structopentableu_opentable;/*文件打开表*/intfd=-1;/*文件打开表的序号*/char*bufferdir;/*记录当前路径的名称*/char*fdisk;/*虚拟磁盘起始地址*/voidinitfile();voidformat();voidenter();voidhalt();intcreate(char*name);intopen(char*name);intclose(char*name);intwrite(intfd,char*buf,intlen);intread(intfd,char*buf);intdel(char*name);intmk

6、dir(char*name);intrmdir(char*name);voiddir();intcd(char*name);voidprint();voidshow();voidinitfile()fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char);/*申请1M空间*/format();voidformat()(inti;FILE*fp;fat=(structfatitem*)(fdisk+DISKSIZE);/*计算FAT表地址,引导区向后偏移1k)*/*-初始化FAT表*/fat0.item=-1;/*引导块*/fat0.em_disk=1;for(i=

7、1;iROOT_DISK_NO-1;i+)/*存放FAT表的磁泵块号*/(fati.item=i+1;fati.em_disk=1;fatROOT_DISK_NO.item=-1;/*存放根目录的磁盘1号*/fatROOT_DISK_NO.em_disk=1;for(i=ROOT_DISK_NO+1;idirectitem0.sign=1;root-directitem0.firstdisk=ROOT_DISK_NO;strcpy(,.);root-directitem0.next=root-directitem0.firstdisk;root-dir

8、perty=1;root-directitem0.size=ROOT_DISK_SIZE;/*指向上一级目录的目录项*/root-directitem1.sign=1;root-directitem1.firstdisk=ROOT_DISK_NO;strcpy(,.);root-directitem1.next=root-directitem0.firstdisk;perty=1;root-directitem1.size=ROOT_DISK_SIZE;if(fp=fopen(disk.d

9、at,wb)=NULL)(printf(Error:nCannotopenfilen);return;for(i=2;idirectitemi.sign=0;root-directitemi.firstdisk=-1;strcpy(,);root-directitemi.next=-1;perty=0;root-directitemi.size=0;)if(fp=fopen(disk.dat,wb)=NULL)(printf(Error:nCannotopenfilen);return;)if(fwrite(fd

10、isk,MEM_D_SIZE,1,fp)!=1)/*把虚拟磁盘空间保存到磁盘文件中*/(printf(Error:nFilewriteerror!n);)fclose(fp);)voidenter()(FILE*fp;inti;fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char);/*申请1M空间*/if(fp=fopen(disk.dat,rb)=NULL)(printf(Error:nCannotopenfilen);return;)if(!fread(fdisk,MEM_D_SIZE,1,fp)/*把磁盘文件disk.dat读入虚拟磁盘空间(内存)*/(

11、printf(Error:nCannotreadfilen);exit(0);)fat=(structfatitem*)(fdisk+DISKSIZE);/*找至UFAT表地址*/root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/fclose(fp);/*初始化用户打开表*/for(i=0;i8)/*文件名大于8位*/return(-1);for(j=2;,name)break;if(jMSD+2)/*文件已经存在*/return(-4);for(i=2;idirectitemi.firstdisk

12、=-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_,name);cur_dir-directitemi.firstdisk=j;cur_dir-directitemi.size=0;cur_dir-directitemi.next=j;cur_d

13、perty=0;/*-*/fd=open(name);return0;intopen(char*name)inti,j;for(i=2;,name)break;if(i=MSD+2)return(-1);/*是文件还是目录*/if(cur_perty=1)return(-4);/*文件是否打开*/for(j=0;jMOFN;j+)(if(!strcmp(u_,name)break;if(j=MOFN)/*文打开太多*/return(-3);

14、/*查找一个空闲用户打开表项*/for(j=0;jdirectitemi.firstdisk;strcpy(u_,name);u_opentable.openitemj.size=cur_dir-directitemi.size;u_opentable.cur_size+;/*返回用户打开表表项的序号*/return(j);intclose(char*name)(inti;for(i=0;i=MOFN)return(-1);/*清空该文件的用户打开表项的内容*/strcpy(u_,);u_opent

15、able.openitemi.firstdisk=-1;u_opentable.openitemi.size=0;u_opentable.cur_size-;return0;)intwrite(intfd,char*buf,intlen)(char*first;intitem,i,j,k;intilen1,ilen2,modlen,temp;/*用$字符作为空格#字符作为换行符*/charSpace=32;charEndter=n;for(i=0;ilen;i+)(if(bufi=$)bufi=Space;elseif(bufi=#)bufi=Endter;)/*读取用户打开表对应表项第一个盘

16、块号*/item=u_opentable.openitemfd.firstdisk;/*找到当前目录所对应表项的序号*/for(i=2;idirectitemi.firstdisk=item)break;)temp=i;/*-存放当前目录项的下标-*/*找到的item是该文件的最后一块磁盘块*/while(fatitem.item!=-1)(item=fatitem.item;/*-查找该文件的下一盘块-*/)/*-计算出该文件的最末地址*/first=fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE;/*-如果最后磁盘块剩余的大

17、小大于要写入的文件的大小*/if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZElen)(strcpy(first,buf);u_opentable.openitemfd.sizeu_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)

18、/*-如果磁盘块已经分配完了-*/return(-1);first=fdisk+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;return0;intread(intfd,char*buf)intlen=u_opentable.openitemfd.size;char*first;inti,j,item;intilen1,modlen;item=u_opentable.openitemfd.firstdisk;ilen1=len/DISKSIZE;modlen=len%DISKSIZE;if(modlen!=0)ilen1=ilen1+1;/*-计算文件所占磁盘的块数-*/项的序号,供释放目录中-*/first=fdisk+item*D

温馨提示

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

评论

0/150

提交评论