




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、華南理工大學(xué)軟件學(xué)院2013級操作系統(tǒng)大作業(yè)實(shí)驗報告課程名稱:操作系統(tǒng)任課老師:作業(yè)題目:簡單二級文件系統(tǒng)班級:學(xué)生姓名:學(xué)號:目錄1 .實(shí)驗?zāi)康? .實(shí)驗環(huán)境3 .實(shí)驗內(nèi)容4 .程序中使用的數(shù)據(jù)結(jié)構(gòu)及符號說明5 .源程序及注釋6 .程序運(yùn)行時的初值和運(yùn)行結(jié)果一、實(shí)驗?zāi)康耐ㄟ^一個簡單多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)。二、實(shí)驗環(huán)境操作系統(tǒng):Ubuntu12.04(Ubuntu/Linaro4.6.3-1ubuntu5)編譯器:gcc4.6.3語言:C語言三、實(shí)驗內(nèi)容FMSV1.0系統(tǒng)模擬了原生的文件系統(tǒng),使用文本來當(dāng)作磁盤,并使用了空閑塊記錄表,目錄,i-node等數(shù)據(jù)
2、結(jié)構(gòu)來輔助文件系統(tǒng)的運(yùn)作。磁盤:一個名為blockDisk的文件,里面含有256個數(shù)據(jù)塊。每個數(shù)據(jù)塊的長度為1024,可存儲1024個字符。I節(jié)點(diǎn):包含文件名,文件保護(hù)碼,文件長度,文件存放位置。目錄:一個鏈表,記錄了i節(jié)點(diǎn)。空閑塊記錄表FBT:用于記錄磁盤塊使用情況,0表示未使用,1表示使用。數(shù)據(jù)塊:保存了文件的數(shù)據(jù),一個數(shù)據(jù)塊至多存放一個文件。數(shù)據(jù)塊使用情況:用于記錄文件使用數(shù)據(jù)塊的情況。存放在I節(jié)點(diǎn)的fat數(shù)組中。文件:一個文件最多占用兩個數(shù)據(jù)塊,即長度至多為4028.FMSV1.0系統(tǒng)支持的命令行:login:登錄register:注冊open:打開文件read:讀取文件數(shù)據(jù)到屏幕wr
3、ite:寫文件,分為cover和append兩種類型;cover是覆蓋原數(shù)據(jù),append是在不改變原始數(shù)據(jù)的基礎(chǔ)上進(jìn)行增加。close:關(guān)閉文件create:新增文件delete:刪除文件exit:退出程序help:幫助四、程序中使用的數(shù)據(jù)結(jié)構(gòu)及符號說明/*結(jié)構(gòu)定義*/*用戶*/typedefstructusercharaccount15;賬戶最長為10charpassword15;密碼最長為10,多出來的是為了方便運(yùn)算user;/*數(shù)據(jù)節(jié)點(diǎn)*/typedefstructdatanode數(shù)據(jù)塊的哪個范圍(intnum;用于記錄文件數(shù)據(jù)保存在哪個intbegin;intend;datanode
4、;/*i節(jié)點(diǎn)*/typedefstructinode(Charfilename30;Intnum;charcode30;數(shù)據(jù)塊號數(shù)據(jù)開始位置數(shù)據(jù)結(jié)束位置保護(hù)碼intsize;datanodefatMAX_DATANODE_NUM;intnode_num;inode;typedefstructdirEntry用鏈表來記錄I節(jié)點(diǎn)inodeind;structdirEntry*next;dirEntry;/*數(shù)據(jù)塊*/typedefstructblock(charcontentMAX_BLOCK_SIZE;數(shù)據(jù)塊內(nèi)容最大長度為1025預(yù)留最后一位用來存儲'0',intnum;into
5、ffset;記錄當(dāng)前數(shù)據(jù)的數(shù)量block;五、源程序及注釋head.h頭文件#include<string.h>#include<stdio.h>#include<stdlib.h>最大數(shù)據(jù)塊數(shù)量是數(shù)據(jù)塊數(shù)據(jù)容量,一#include<stdbool.h>#defineMAX_BLOCKS_NUM256256,則數(shù)據(jù)塊總大小是256KB#defineMAX_BLOCK_SIZE1025個數(shù)據(jù)塊的大小是1KB,最有1位用來存儲'0',表示字符串結(jié)尾!#defineMAX_DATANODE_NUM2每個文件最多占用的數(shù)據(jù)塊的數(shù)量#def
6、ineMAX_INODE_NUM512/i節(jié)點(diǎn)的最大數(shù)目,亦即系統(tǒng)允許容納文件的最大數(shù)量#defineMAX_CACHE_NUM32允許緩存的最大數(shù)據(jù)塊數(shù)量為32個數(shù)據(jù)塊,緩存為32KB/*結(jié)構(gòu)定義*/*用戶*/typedefstructusercharaccount15;賬戶最長為10charpassword15;密碼最長為10,多出來的是為了方便運(yùn)算user;/*數(shù)據(jù)節(jié)點(diǎn)*/用于記錄文件數(shù)據(jù)保存在哪typedefstructdatanode個數(shù)據(jù)塊的哪個范圍(數(shù)據(jù)塊號數(shù)據(jù)開始位置數(shù)據(jù)結(jié)束位置intnum;intbegin;intend;datanode;/*i節(jié)點(diǎn)*/typedefstru
7、ctinode(charfilename30;intnum;charcode30;保護(hù)碼intsize;datanodefatMAX_DATANODE_NUM;intnode_num;inode;typedefstructdirEntry用鏈表來記錄I節(jié)點(diǎn)inodeind;structdirEntry*next;dirEntry;/*數(shù)據(jù)塊*/typedefstructblock數(shù)據(jù)塊內(nèi)容用于記錄數(shù)據(jù)塊記錄當(dāng)前數(shù)據(jù)的(charcontentMAX_BLOCK_SIZE;最大長度為1024intnum;boolisRevised;是否進(jìn)行數(shù)據(jù)修改intoffset;數(shù)量block;/*定義全局變
8、量*/intislogin=0;/0meansthecharblockspath30="userdata/blocksDISK.disk"/所有數(shù)據(jù)(即虛擬磁盤)地址charuserspath30="userdata/users.us"staticusercurrUser;當(dāng)前用戶staticdirEntry*DIR;staticintcurr_inode_num=0;當(dāng)前i節(jié)點(diǎn)數(shù)量,亦即文件數(shù)量staticblock*cache;intmax_node=0;最大的inode編號staticintFBTMAX_BLOCKS_NUM;staticchar*
9、dirpath;staticcharfbtpath30="userdata/FBT.disk"staticdirEntry*selectEntry;當(dāng)selectEntry=NULL時,證明沒有打開文件staticdirEntry*currEntry;命令行staticcharcm_help10="help"staticcharcm_lg10="login"staticcharcm_rg10="register"staticcharcm_dir10="dir"staticcharcm_creat
10、e10="create"staticcharcm_delete10="delete"staticcharcm_open10="open"staticcharcm_read10="read"staticcharcm_write10="write"staticcharcm_close10="close"staticcharcm_exit10="exit"staticcharcm_cancle10="cancle"/*函數(shù)聲明*/voidcr
11、eateStyle(int,char);voidcreateWrap(int);intcreateSystem();intdiskUpdate(block);voidstart();voidgetUser();intlogin();intregist();charlgOrRg();voidcreateBlocksDisk();FILE*createDir();voidinitDir(char*);intgetAction();voidinitFBT();初始化數(shù)據(jù)空閑塊記錄表intgetCode();intgetFreeBlock(bool);voidsaveDir();voidsaveBlo
12、ck(blockbk);voidsaveFBT();intcreateHelp(char*filename);dirEntry*delHelp(char*filename);voidcreateDataDir();登錄或注冊響應(yīng)指令的函數(shù)intLgRg();voidhelp();voiddir();voidcreate();voiddel();voidopen();voidclose();voidread();voidwrite();voidcoverHelp();voidappendHelp();/Linuxdoesn'tsupportthefunctionstrcmpi,soIne
13、strcmpi(char*p1,char*p2)if(strlen(p1)!=strlen(p2)return-1;inti;for(i=0;i<strlen(p1);i+)if(p1i!=p2i)return-1;)return0;)voidcreateDataDir()(char*datapath="userdata"printf("NodataDir!nNowcreateitn");if(mkdir(datapath,0777)(printf("CannotcreateDataDirn
14、PleasecontactQQ878631510forhelpnCrtl+Ctoexit.n");while(1);)printf("SucceedcreatingdataDir!n");)voidshowInode(inodeind)printf("num:%dn",ind.num);printf("filename:%sn",ind.filename);printf("size:%dn",ind.size);)界面美化函數(shù)voidcreateStyle(intnum,charstyle)(while(
15、num-)(printf("%c",style);)voidcreateWrap(intn)(while(n-)(printf("n");輔助函數(shù)charlgOrRg()while(1)charcom10;printf("loginorregister:");scanf("%s",com);if(!strcmpi(com,cm_lg)(returnT;if(!strcmp(com,cm_rg)(return'r'voidhelp()printf("歡迎您使用FMS文件系統(tǒng)模擬系統(tǒng)V1.0&
16、quot;);printf("以下是本系統(tǒng)支持的指令:n");printf("exit:退出n");printf("help:幫助n");printf("dir:查看目錄中的所有文件n");printf("create:新建文件n");printf("delete:刪除文件n");printf("open:打開文件n");printf("read:讀文件(必須先打開文件)n");printf("write:寫文件(必須先打開文
17、件)n");printf("close:關(guān)閉文件n");voidcreateBlocksDisk()初始化磁盤塊FILE*fp=fopen(blockspath,"w");if(fp=NULL)printf("CannotcreateDisk!nCtrl+Ctoquitn");while(1);else(inti,j;for(i=0;i<MAX_BLOCKS_NUM;i+)(for(j=0;j<MAX_BLOCK_SIZE;j+)(fputc('$',fp);)fclose(fp);)FILE*p
18、=fopen(fbtpath,"w");if(p=NULL)(printf("FBTCreatedERROR!n");while(1);)elseinti;for(i=0;i<MAX_BLOCKS_NUM;i+)(FBTi=0;fprintf(p,"%d",0);fclose(p);dirEntry*isInDir(char*filename)(inti;dirEntry*pt=DIR;while(pt!=NULL)(if(!strcmpi(pt->ind.filename,filename)(returnpt;pt=pt
19、->next;returnNULL;dirEntry*delHelp(char*filename)(dirEntry*res=DIR;if(res=NULL)(printf("Nofiles!n");returnres;)if(res->next=NULL)(if(!strcmpi(res->ind.filename,filename)(DIR=NULL;currEntry=NULL;printf("刪除成功!n");returnres;)elsereturnNULL;if(!strcmpi(res->ind.filename,f
20、ilename)(DIR=res->next;printf("刪除成功!n");returnres;)while(res->next!=NULL)(if(!strcmpi(res->next->ind.filename,filename)(dirEntry*r=res->next;res->next=r->next;printf("刪除成功!n");returnr;)res=res->next;)printf("刪除失敗!n");returnNULL;voidcoverHelp()(釋放
21、原數(shù)據(jù)塊,更新FBTintf;if(selectEntry->ind.size!=0)要size>0才會分配數(shù)據(jù)塊(for(f=0;f<selectEntry->ind.node_num;f+)(FBTselectEntry->ind.fatf.num=0;charcontentMAX_DATANODE_NUMMAX_BLOCK_SIZE;chartmp;inodeind;printf("Endwith'$''n");inti=0;while(tmp=getchar()!='$')(if(i=0&
22、&tmp='n')(continue;contenti/MAX_BLOCK_SIZEi+=tmp;)ind.size=i;此時已經(jīng)結(jié)束輸入if(i>(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)printf("文件過大,無法存儲,創(chuàng)建失敗!n");return;)intk;for(k=0;k<=i/(MAX_BLOCK_SIZE-1);k+)blockbk;intbkn;for(bkn=0;bkn<MAX_BLOCK_SIZE-1;bkn+)bk.contentbkn='$')bk.cont
23、entMAX_BLOCK_SIZE-1='0'/printf("bk.content:%sn",bk.content);char*tmp;inttp=0;intlen=0;if(k=0)(if(i<MAX_BLOCK_SIZE-1)(len=i;if(k=1)(len=i%(MAX_BLOCK_SIZE-1)+1;for(tp=0;tp<len;tp+)(bk.contenttp=contentktp;bk.isRevised=true;if(k=0)bk.num=getFreeBlock(false);)else(bk.num=getFreeB
24、lock(true);if(bk.num=-1)(printf("數(shù)據(jù)塊已用完,內(nèi)存不足!n");return;)saveBlock(bk);ind.fatk.num=bk.num;ind.fatk.begin=0;ind.fatk.end=len;)ind.node_num=k;strcpy(ind.code,selectEntry->ind.code);strcpy(ind.filename,selectEntry->ind.filename);ind.num=selectEntry->ind.node_num;selectEntry->ind=
25、ind;saveDir();saveFBT();printf("文件已保存!n");)voidappendHelp()chartmpMAX_BLOCK_SIZE*2;charch;printf("Endwith'$':n");inti=0;while(ch=getchar()!='$')if(i=0&&ch='n')continue;)tmpi+=ch;)tmpi='0'此時已經(jīng)完成輸入if(i+selectEntry->ind.size)>(MAX_BLOCK_
26、SIZE-1)*MAX_DATANODE_NUM)printf("文件過大,無法存儲,創(chuàng)建失?。");return;else(if(selectEntry->ind.size>MAX_BLOCK_SIZE-1)已經(jīng)占用了兩個block(intoffset=selectEntry->ind.size-MAX_BLOCK_SIZE+1;FILE*bfp=fopen(blockspath,"r+");if(bfp=NULL)(printf("DISKERROR!nFromappendFile.n");return;)el
27、se(fseek(bfp,(selectEntry->ind.fat1.num*(MAX_BLOCK_SIZE-1)+offset),SEEK_SET);fwrite(tmp,sizeof(char),i,bfp);fclose(bfp);selectEntry->ind.size=selectEntry->ind.size+i;selectEntry->ind.fat1.end=selectEntry->ind.fat1.end+i;saveDir();printf("文件保存成功!n");else只占用了一個blockif(i<(MA
28、X_BLOCK_SIZE-1-selectEntry->ind.size)不會占用新的blockFILE*bfp=fopen(blockspath,"r+");if(bfp=NULL)printf("DISKERROR!nFromappendFile.n");return;else/if(selectEntry->ind.size=0)/fseek(bfp,0,SEEK_SET);/selectEntry->ind.fat0=0;/else/fseek(bfp,(selectEntry->ind.fat0.num*(MAX_BLO
29、CK_SIZE-1)+selectEntry->ind.size),SEEK_SET);/printf("ftell=%l",ftell(bfp);fseek(bfp,(selectEntry->ind.fat0.num*(MAX_BLOCK_SIZE-1)+selectEntry->ind.size),SEEK_SET);fwrite(tmp,sizeof(char),i,bfp);fclose(bfp);selectEntry->ind.size=selectEntry->ind.size+i;selectEntry->ind.fat
30、0.endselectEntry->ind.fat0.end+i;saveDir();printf("文件保存成功!n");else要占用新的block(intbkNum=getFreeBlock(true);if(bkNum=-1)(printf("數(shù)據(jù)塊已用完,內(nèi)存不足!n");*p1return;char*p2(char*)malloc(MAX_BLOCK_SIZE-1-selectEntry->ind.size)*sizeof(char);char(char*)malloc(i-(MAX_BLOCK_SIZE-1-selectEntr
31、y->ind.size)*sizeof(char);intpi;intpn1=0,pn2=0;for(pi=0;pi<i;pi+)(if(pi<MAX_BLOCK_SIZE-1-selectEntry->ind.size)p1pn1+=tmppi;)else(p2pn2+=tmppi;)p1pn1='0'p2pn2='0'存儲FILE*bfp=fopen(blockspath,"r+");if(bfp=NULL)(printf("DISKERROR!nFromappendFilen");return
32、;)else(fseek(bfp,(MAX_BLOCK_SIZE-1)*selectEntry->ind.fat0.num+selectEntry->ind.fat0.end),SEEK_SET);fwrite(p1,sizeof(char),pn1,bfp);printf("linenear481n");fseek(bfp,(MAX_BLOCK_SIZE-1)*bkNum),SEEK_SET);fwrite(p2,sizeof(char),pn2,bfp);fclose(bfp);FBTbkNum=1;selectEntry->ind.node_num=
33、2;selectEntry->ind.size=selectEntry->ind.size+i;selectEntry->ind.fat0.endMAX_BLOCK_SIZE-2;selectEntry->ind.fat1.num=bkNum;selectEntry->ind.fat1.begin=0;selectEntry->ind.fat1.end=pn2;saveFBT();saveDir();printf("文件保存成功!n");核心函數(shù)voidcreate()intbkNum=getFreeBlock(false);if(bkN
34、um=-1)printf("數(shù)據(jù)塊已用完,內(nèi)存不足!n");return;chartmp;dirEntry*pt=(dirEntry*)malloc(sizeof(dirEntry);pt->next=NULL;while(1)printf("filename:");scanf("%s”,pt->ind.filename);if(isInDir(pt->ind.filename)!=NULL)(printf("文件名已存在!n請重新輸入:n");elsebreak;)while(1)(printf(&quo
35、t;Doyouwanttowritethefile?y/n:");scanf("%c”,&tmp);if(tmp='y')|(tmp='Y')|(tmp='n')|(tmp='N')(break;)pt->ind.num=curr_inode_num+;文件保護(hù)碼不是很懂,因此默認(rèn)為"rrrwwwxxx"charcode10="rrrwwwxxx"strcpy(pt->ind.code,code);pt->ind.size=0;pt->in
36、d.node_num=0;初始化,跟存儲要相符合boolisNoBk=false;if(tmp='y'|tmp='Y')(charcontentMAX_DATANODE_NUMMAX_BLOCK_SIZE;chartmp;printf("Endwith'$''n");inti=0;while(tmp=getchar()!='$')(if(i=0&&tmp='n')(continue;contenti/MAX_BLOCK_SIZEi+=tmp;pt->ind.size
37、=i;此時已經(jīng)結(jié)束輸入if(i>(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)(printf("文件過大,無法存儲,創(chuàng)建失敗!n");return;intk;for(k=0;k<=i/(MAX_BLOCK_SIZE-1);k+)(blockbk;intbkn;for(bkn=0;bkn<MAX_BLOCK_SIZE-1;bkn+)(bk.contentbkn='$'bk.contentMAX_BLOCK_SIZE-1=''0'printf("bk.content:%sn"
38、,bk.content);char*tmp;inttp=0;intlen=0;if(k=0)(if(i<MAX_BLOCK_SIZE-1)(len=i;if(k=1)len=i%(MAX_BLOCK_SIZE-1)+1;)for(tp=0;tp<len;tp+)(bk.contenttp=contentktp;)bk.isRevised=true;if(k=0)(bk.num=bkNum;)else(bk.num=getFreeBlock(true);if(bk.num=-1)(printf("數(shù)據(jù)塊已用完,內(nèi)存不足!n");return;)saveBlock(
39、bk);pt->ind.fatk.num=bk.num;pt->ind.fatk.begin=0;pt->ind.fatk.end=len;)pt->ind.node_num=k;)if(currEntry=NULL)DIR=pt;)elsecurrEntry->next=pt;)currEntry=pt;saveDir();saveFBT();printf("Succeedcreatefile%s!",pt->ind.filename);)voiddel()chartmp30;printf("請輸入要刪除的文件名:"
40、);scanf("%s",tmp);if(isInDir(tmp)=NULL)(printf("不存在這個文件。n");return;else(dirEntry*dle=delHelp(tmp);if(dle!=NULL)(inti;for(i=0;i<dle->ind.node_num;i+)(FBTdle->ind.fati.num=0;saveDir();saveFBT();voidopen()(charfile50;printf("請輸入文件名:");scanf("%s",file);se
41、lectEntry=isInDir(file);if(selectEntry=NULL)(printf("沒有這個文件!n");)else(printf("文件%s已打開,輸入close關(guān)閉.n",file);intc=0;while(1)(if(c=1)(break;switch(getCode()(case 5:read();break;case 6:write();break;case 7:close();c=1;break;default:printf("無效的指令n");voidread()(FILE*bfp=fopen(b
42、lockspath,"r");if(bfp=NULL)(printf("不存在磁盤文件!n");while(1);)else打開磁盤文件(inti;chartmp=''printf("文件%s中的內(nèi)容如下:n",selectEntry->ind.filename);if(selectEntry->ind.size=0)(printf(”內(nèi)容為空。n");)else(for(i=0;i<selectEntry->ind.node_num;i+)(fseek(bfp,(selectEntr
43、y->ind.fati.num*(MAX_BLOCK_SIZE-1),SEEK_SET);這個offset彳艮重要intj;for(j=selectEntry->ind.fati.begin;j<selectEntry->ind.fati.end;j+)tmp=fgetc(bfp);printf("%c",tmp);printf("n");fclose(bfp);voidclose()selectEntry=NULL;printf("文件已關(guān)閉!n");voidwrite()charsel10;charcm_cover10=&
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度購房補(bǔ)充協(xié)議:智能家居與社區(qū)物業(yè)聯(lián)動服務(wù)合同
- 2025年度法律服務(wù)機(jī)構(gòu)員工借調(diào)與法律服務(wù)合同
- 二零二五年度刑法與合同法協(xié)同的特許經(jīng)營合同
- 二零二五年度安全環(huán)保風(fēng)險評估與咨詢服務(wù)協(xié)議
- 二零二五年度高管勞動合同及職業(yè)培訓(xùn)協(xié)議
- 2025陜西通力專用汽車有限責(zé)任公司招聘(59人)筆試參考題庫附帶答案詳解
- 2025環(huán)北部灣廣西水資源配置有限公司招聘23人筆試參考題庫附帶答案詳解
- 2025年收獲機(jī)械項目建議書
- 2025年國網(wǎng)電力公司招聘(第二批)筆試參考題庫附帶答案詳解
- 藥品裝業(yè)知識培訓(xùn)課件
- 建設(shè)工程施工專業(yè)分包合同(GF-2003-0213)
- 司法心理學(xué)課件
- 耳鼻喉科各項規(guī)章制度
- 湖南科技職業(yè)學(xué)院單招職業(yè)技能測試參考試題庫(含答案)
- 玻璃分化板制作工藝
- 減鹽減油健康教育
- 電動平車使用說明書
- 2024年智能鑄造生產(chǎn)線項目建設(shè)方案
- 中藥臨床藥師的溝通與協(xié)作技巧
- 設(shè)備采購計劃書
- 專業(yè)橋梁加固方法研究報告
評論
0/150
提交評論