操作系統(tǒng)文件管理系統(tǒng)模擬實驗_第1頁
操作系統(tǒng)文件管理系統(tǒng)模擬實驗_第2頁
操作系統(tǒng)文件管理系統(tǒng)模擬實驗_第3頁
操作系統(tǒng)文件管理系統(tǒng)模擬實驗_第4頁
操作系統(tǒng)文件管理系統(tǒng)模擬實驗_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、文件管理系統(tǒng)模擬1 .實驗?zāi)康耐ㄟ^一個簡單多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實現(xiàn)2 .實驗內(nèi)容為Linux系統(tǒng)設(shè)計一個簡單的二級文件系統(tǒng)。要求做到以下幾點:(1)可以實現(xiàn)下列幾條命令(至少4條)login用戶登錄dir列文件目錄create創(chuàng)建文件delete刪除文件open打開文件close關(guān)閉文件read讀文件write寫文件(2)列目錄時要列出文件名、物理地址、保護(hù)碼和文件長度;(3)源文件可以進(jìn)行讀寫保護(hù)。3 .實驗提小(1)首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。(2)用戶創(chuàng)建的文件,可

2、以編號存儲于磁盤上。入file0,file1,file2并以編號作為物理地址,在目錄中進(jìn)行登記。4.源代碼#include#include#include#defineMEM_D_SIZE1024*1024/總磁盤空間為1M#defineDISKSIZE1024磁盤塊的大小1K#defineDISK_NUM1024磁盤塊數(shù)目1K#defineFATSIZEDISK_NUM*sizeof(structfatitem)/FAT表大小#defineROOT_DISK_NOFATSIZE/DISKSIZE+1/根目錄起始盤塊號#defineROOT_DISK_SIZEsizeof(structdire

3、ct)/根目錄大小#defineDIR_MAXSIZE1024/路徑最大長度為1KB#defineMSD5/最大子目錄數(shù)5#defineMOFN5/最大文件深度為5#defineMAX_WRITE1024*128/最大后入文字長度128KBstructfatitem/*size8*/intitem;/*存放文件下一個磁盤的指針*/charem_disk;/*磁盤塊是否空閑標(biāo)志位0空閑*/;structdirect/*-文件控制快信息-*/structFCBcharname9;/*文件/目錄名8位*/charproperty;/*屬性1位目錄0位普通文件*/intsize;/*文件/目錄字節(jié)數(shù)、

4、盤塊數(shù))*/intfirstdisk;/*文件/目錄起始盤塊號*/intnext;/*子目錄起始盤塊號*/intsign;/*1是根目錄0不是根目錄*/directitemMSD+2;structopentablestructopenttableitemcharname9;/*文件名*/intfirstdisk;/*起始盤塊號*/intsize;/*文件的大小*/openitemMOFN;intcur_size;/*當(dāng)前打文件的數(shù)目*/;structfatitem*fat;/*FAT表*/structdirect*root;/*根目錄*/structdirect*cur_dir;/*當(dāng)前目錄*

5、/一structopentableu_opentable;/*文件打開表*/intfd=-1;/*文件打開表的序號*/char*bufferdir;/*記錄當(dāng)前路徑的名稱*/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表地址,引導(dǎo)區(qū)向后偏移1k)*/*-初始化FAT表*/fat0.item=-1;/*引導(dǎo)塊*/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讀入虛擬磁盤空間(內(nèi)存)*/(

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)/*文件已經(jīng)存在*/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;/*將空閑塊置為已經(jīng)分配*/*填寫目錄項*/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);/*清空該文件的用戶打開表項的內(nèi)容*/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;)/*讀取用戶打開表對應(yīng)表項第一個盤

16、塊號*/item=u_opentable.openitemfd.firstdisk;/*找到當(dāng)前目錄所對應(yīng)表項的序號*/for(i=2;idirectitemi.firstdisk=item)break;)temp=i;/*-存放當(dāng)前目錄項的下標(biāo)-*/*找到的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、/*-如果磁盤塊已經(jīng)分配完了-*/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;/*-計算文件所占磁盤的塊數(shù)-*/項的序號,供釋放目錄中-*/first=fdisk+item*D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論