




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、華南理工大學(xué)軟件學(xué)院2021級操作系統(tǒng)大作業(yè)實驗報告課程名稱:操作系統(tǒng)任課老師:作業(yè)題目:簡單二級文件系統(tǒng)班級:學(xué)生姓名:學(xué)號:目錄1 1. .實驗?zāi)康? 2 . .實驗環(huán)境3 3 . .實驗內(nèi)容4 4 . .程序中使用的數(shù)據(jù)結(jié)構(gòu)及符號說明5 5 . .源程序及注釋6 6 . .程序運行時的初值和運行結(jié)果一、實驗?zāi)康耐ㄟ^一個簡單多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實現(xiàn).二、實驗環(huán)境操作系統(tǒng):Ubuntu12.04(Ubuntu/Linaro4.6.3-1ubuntu5)編譯器:gcc4.6.3C語言三、實驗內(nèi)容FMSV1.0系統(tǒng)模擬了原生的文件系統(tǒng),使用文本來當(dāng)作磁盤,并使用
2、了空閑塊記錄表,目錄,i-node等數(shù)據(jù)結(jié)構(gòu)來輔助文件系統(tǒng)的運作.磁盤:一個名為blockDisk的文件,里面含有256個數(shù)據(jù)塊.每個數(shù)據(jù)塊的長度為1024,可存儲1024個字符.I節(jié)點:包含文件名,文件保護碼,文件長度,文件存放位置.目錄:一個鏈表,記錄了i節(jié)點.空閑塊記錄表FBT:用于記錄磁盤塊使用情況,0表示未使用,1表示使用.數(shù)據(jù)塊:保存了文件的數(shù)據(jù),一個數(shù)據(jù)塊至多存放一個文件.數(shù)據(jù)塊使用情況:用于記錄文件使用數(shù)據(jù)塊的情況.存放在I語言節(jié)點的fat數(shù)組中.文件:一個文件最多占用兩個數(shù)據(jù)塊,即長度至多為4028.FMSV1.0系統(tǒng)支持的命令行:login:登錄register:注冊ope
3、n:翻開文件read:讀取文件數(shù)據(jù)到屏幕write:寫文件,分為cover和append兩種類型;cover是覆蓋原數(shù)據(jù),append是在不改變原始數(shù)據(jù)的根底上進行增加.close:關(guān)閉文件create:新增文件delete:刪除文件exit:退出程序help:幫助四、程序中使用的數(shù)據(jù)結(jié)構(gòu)及符號說明/*結(jié)構(gòu)定義*/*用戶*/typedefstructusercharaccount15;/賬戶最長為10charpassword15;/密碼最長為10,多出來的是為了方便運算user;/*數(shù)據(jù)節(jié)點*/typedefstructdatanode數(shù)據(jù)塊的哪個范圍intnum;/用于記錄文件數(shù)據(jù)保存在哪個
4、intbegin;intend;datanode;/*i節(jié)點*/typedefstructinodeCharfilename30;Intnum;charcode30;/數(shù)據(jù)塊號/數(shù)據(jù)開始位置/數(shù)據(jù)結(jié)束位置/保護碼intsize;datanodefatMAX_DATANODE_NUM;intnode_num;inode;typedefstructdirEntry/用鏈表來記錄I節(jié)點inodeind;structdirEntry*next;dirEntry;/*數(shù)據(jù)塊*/typedefstructblockcharcontentMAX_BLOCK_SIZE;/數(shù)據(jù)塊內(nèi)容最大長度為1025,預(yù)留最后
5、一位用來存儲0,intnum;intoffset;/記錄當(dāng)前數(shù)據(jù)的數(shù)量block;五、源程序及注釋head.h頭文件#include#include#include#include#defineMAX_BLOCKS_NUM256256,那么數(shù)據(jù)塊總大小是256KB#defineMAX_BLOCK_SIZE1025/最大數(shù)據(jù)塊數(shù)量是/數(shù)據(jù)塊數(shù)據(jù)容量,個數(shù)據(jù)塊的大小是1KB,最有1位用來存儲0,表示字符串結(jié)尾!#defineMAX_DATANODE_NUM2/每個文件最多占用的數(shù)據(jù)塊的數(shù)量#defineMAX_INODE_NUM512/i節(jié)點的最大數(shù)目,亦即系統(tǒng)允許容納文件的最大數(shù)量#define
6、MAX_CACHE_NUM32/允許緩存的最大數(shù)據(jù)塊數(shù)量為32個數(shù)據(jù)塊,緩存為32KB/*結(jié)構(gòu)定義*/*用戶*/typedefstructusercharaccount15;/賬戶最長為10charpassword15;/密碼最長為10,多出來的是為了方便運算user;/*數(shù)據(jù)節(jié)點*/typedefstructdatanode個數(shù)據(jù)塊的哪個范圍intnum;intbegin;intend;datanode;/*i節(jié)點*/typedefstructinodecharfilename30;intnum;charcode30;/保護碼intsize;datanodefatMAX_DATANODE_N
7、UM;intnode_num;inode;inodeind;typedefstructdirEntry/用鏈表來記錄I節(jié)點/數(shù)據(jù)塊號structdirEntry*next;dirEntry;/*數(shù)據(jù)塊*/typedefstructblockcharcontentMAX_BLOCK_SIZE;最大長度為1024intnum;boolisRevised;是否進行數(shù)據(jù)修改intoffset;數(shù)量block;/*定義全局變量*/intislogin=0;/0meansthe/數(shù)據(jù)塊內(nèi)容/用于記錄數(shù)據(jù)charblockspath30=userdata/blocksDISK.disk;/所有數(shù)據(jù)即虛擬磁盤
8、地址charuserspath30=userdata/users.us;staticusercurrUser;/當(dāng)前用戶staticdirEntry*DIR;staticintcurr_inode_num=0;/當(dāng)前i節(jié)點數(shù)量,亦即文件數(shù)量staticblock*cache;intmax_node=0;最大的inode編號staticintFBTMAX_BLOCKS_NUM;staticchar*dirpath;staticcharfbtpath30=userdata/FBT.disk;staticdirEntry*selectEntry;/當(dāng)selectEntry=NULL時,證明沒有翻開文
9、件staticdirEntry*currEntry;/命令行staticcharcm_help10=help;staticcharcm_lg10=login;staticcharcm_rg10=register;staticcharcm_dir10=dir;staticcharcm_create10=create;staticcharcm_delete10=delete;staticcharcm_open10=open;staticcharcm_read10=read;staticcharcm_write10=write;staticcharcm_close10=close;staticcha
10、rcm_exit10=exit;staticcharcm_cancle10=cancle;/*函數(shù)聲明*/voidcreateStyle(int,char);voidcreateWrap(int);intcreateSystem();intdiskUpdate(block);voidstart();voidgetUser();intlogin();intregist();charlgOrRg();voidcreateBlocksDisk();FILE*createDir();voidinitDir(char*);intgetAction();voidinitFBT();intgetCode()
11、;intgetFreeBlock(bool);voidsaveDir();voidsaveBlock(blockbk);voidsaveFBT();intcreateHelp(char*filename);dirEntry*delHelp(char*filename);voidcreateDataDir();/響應(yīng)指令的函數(shù)intLgRg();voidhelp();voiddir();/初始化/voidcreate();voiddel();voidopen();voidclose();voidread();voidwrite();voidcoverHelp();voidappendHelp()
12、;/Linuxdoesntsupportthefunctionstrcmpi,soIstrcmpi(char*p1,char*p2)if(strlen(p1)!=strlen(p2)return-1;inti;for(i=0;istrlen(p1);i+)if(p1i!=p2i)return-1;return0;voidcreateDataDir()char*datapath=userdata;printf(NodataDir!nNowcreateit.n);if(mkdir(datapath,0777)printf(Cannotcreate
13、DataDir.nPleasecontactQQ878631510forhelp.nCrtl+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(num-)printf(%c,style);voidcreateWrap(intn)while
14、(n-)printf(n);/輔助函數(shù)charlgOrRg()while(1)charcom10;printf(loginorregister:);scanf(%s,com);if(!strcmpi(com,cm_lg)returnl;if(!strcmp(com,cm_rg)returnr;voidhelp()printf歡送您使用FMS文件系統(tǒng)模擬系統(tǒng)V1.0;printf以下是本系統(tǒng)支持的指令:n;printfexit:退出n;printfhelp:幫助n;printfdir:查看目錄中的所有文件n;printfcreate:新建文件n;printfdelete:刪除文件n;printf
15、open:翻開文件n;printfread:讀文件必須先翻開文件n;printfwrite:寫文件必須先翻開文件n;printfclose:關(guān)閉文件n;voidcreateBlocksDisk/初始化磁盤塊FILE*fp=fopenblockspath,w;iffp=NULLprintfCannotcreateDisk!nCtrl+Ctoquitn;while1;elseinti,j;for(i=0;iMAX_BLOCKS_NUM;i+)for(j=0;jMAX_BLOCK_SIZE;j+)fputc($,fp);fclose(fp);FILE*p=fopen(fbtpath,w);if(p=
16、NULL)printf(FBTCreatedERROR!n);while(1);elseinti;for(i=0;iind.filename,filename)returnpt;pt=pt-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);returnr
17、es;elsereturnNULL;if(!strcmpi(res-ind.filename,filename)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()/釋放原數(shù)據(jù)塊,更新FBTintf;if(selectEn
18、try-ind.size!=0)/要size0才會分配數(shù)據(jù)塊for(f=0;find.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&tmp=n)continue;contenti/MAX_BLOCK_SIZEi+=tmp;ind.size=i;/此時已經(jīng)結(jié)束輸入if(i(MAX_BLOCK_SIZE-1)*MAX_DATANODE_
19、NUM)printf(文件過大,無法存儲,創(chuàng)立失敗!n);return;intk;for(k=0;k=i/(MAX_BLOCK_SIZE-1);k+)blockbk;intbkn;for(bkn=0;bknMAX_BLOCK_SIZE-1;bkn+)bk.contentbkn=$;bk.contentMAX_BLOCK_SIZE-1=0;/printf(bk.content:%sn,bk.content);char*tmp;inttp=0;intlen=0;if(k=0)if(iMAX_BLOCK_SIZE-1)len=i;if(k=1)len=i%(MAX_BLOCK_SIZE-1)+1;f
20、or(tp=0;tpind.code);strcpy(ind.filename,selectEntry-ind.filename);ind.num=selectEntry-ind.node_num;selectEntry-ind=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
21、+selectEntry-ind.size)(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)printf文件過大,無法存儲,創(chuàng)立失敗!n;return;elseif(selectEntry-ind.sizeMAX_BLOCK_SIZE-1)/已經(jīng)占用了兩個blockintoffset=selectEntry-ind.size-MAX_BLOCK_SIZE+1;FILE*bfp=fopen(blockspath,r+);if(bfp=NULL)printf(DISKERROR!nFromappendFile.n);return;elsefseek(bfp,(selectE
22、ntry-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(iind.size)/不會占用新的blockFILE*bfp=fopen(blockspath,r+);if(bfp=N
23、ULL)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_BLOCK_SIZE-1)+selectEntry-ind.size),SEEK_SET);/printf(ftell=%l,ftell(bfp);fseek(bfp,(selectEntry-ind.fat0.num*(MAX_BLOCK_SIZE-1)
24、+selectEntry-ind.size),SEEK_SET);fwrite(tmp,sizeof(char),i,bfp);fclose(bfp);selectEntry-ind.size=selectEntry-ind.size+i;selectEntry-ind.fat0.endselectEntry-ind.fat0.end+i;saveDir();printf文件保存成功!n;else/要占用新的blockintbkNum=getFreeBlock(true);if(bkNum=-1)printf數(shù)據(jù)塊已用完,內(nèi)存缺乏!n;return;char(char*)malloc(MAX_
25、BLOCK_SIZE-1-selectEntry-ind.size)*sizeof(char);char(char*)malloc(i-(MAX_BLOCK_SIZE-1-selectEntry-ind.size)*sizeof(char);intpi;intpn1=0,pn2=0;for(pi=0;pii;pi+)if(piind.size)p1pn1+=tmppi;*p1*p2elsep2pn2+=tmppi;p1pn1=0;p2pn2=0;/存儲FILE*bfp=fopen(blockspath,r+);if(bfp=NULL)printf(DISKERROR!nFromappendFi
26、le.n);return;elsefseek(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=2;selectEntry-
27、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(bkNum=-1)printf數(shù)據(jù)塊已用完,內(nèi)存缺乏!n;return;chartmp;dirEntry
28、*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(Doyouwanttowritethefile?y/n:);scanf(%c,&tmp);if(tmp=y)|(tmp=Y)|(tmp=n)|(tmp=N)break;pt-ind.num=curr_inode_num+;/文
29、件保護碼不是很懂,因此默認(rèn)為rrrwwwxxx;charcode10=rrrwwwxxx;strcpy(pt-ind.code,code);pt-ind.size=0;pt-ind.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-i
30、nd.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;bknMAX_BLOCK_SIZE-1;bkn+)bk.contentbkn=$;bk.contentMAX_BLOCK_SIZE-1=0;/printf(bk.content:%sn,bk.content);char*tmp;inttp=0;intlen=0;if(k=0)if(iMAX
31、_BLOCK_SIZE-1)len=i;if(k=1)len=i%(MAX_BLOCK_SIZE-1)+1;for(tp=0;tpind.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(請輸入要刪除
32、的文件名:);scanf(%s,tmp);if(isInDir(tmp)=NULL)printf(不存在這個文件.n);return;elsedirEntry*dle=delHelp(tmp);if(dle!=NULL)inti;for(i=0;iind.node_num;i+)FBTdle-ind.fati.num=0;saveDir();saveFBT();voidopen()charfile50;printf(請輸入文件名:);scanf(%s,file);selectEntry=isInDir(file);if(selectEntry=NULL)printf(沒有這個文件!n);els
33、eprintf(文 件%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(blockspath,r);if(bfp=NULL)printf(不存在磁盤文件!n);while(1);else/翻開磁盤文件inti;chartmp=;printf(文件%s中的內(nèi)容如下:n,sele
34、ctEntry-ind.filename);if(selectEntry-ind.size=0)printf(內(nèi)容為空.n);elsefor(i=0;iind.node_num;i+)fseek(bfp,(selectEntry-ind.fati.num*(MAX_BLOCK_SIZE-1),SEEK_SET);這個offset彳艮重要intj;for(j=selectEntry-ind.fati.begin;jind.fati.end;j+)tmp=fgetc(bfp);printf(%c,tmp);printf(n);fclose(bfp);voidclose()selectEntry=NULL;printf(文件已關(guān)閉!n);voidwrite()charsel10;charcm_cover10=cover;charcm_append10=append;while(1)printf(請輸入指令
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村電商服務(wù)站農(nóng)村電商數(shù)據(jù)分析與運營模式報告
- 深度復(fù)習(xí)中級會計實務(wù)試題及答案分享
- 安徽由金自動化儀器儀表設(shè)備有限公司介紹企業(yè)發(fā)展分析報告
- 江門節(jié)能環(huán)保項目可行性分析報告
- 保險公司內(nèi)部審計報告范文
- 消防短語考試題目及答案
- 消防初級理論試題及答案
- 鋅合金壓鑄機生產(chǎn)建設(shè)項目可行性研究報告-立項
- 2025年中國輪式拖拉機行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 2025至2030年中國米酒行業(yè)投資前景及策略咨詢研究報告
- 北京故宮的詳細資料資料講解
- GB/T 38472-2023再生鑄造鋁合金原料
- 莫高窟經(jīng)典簡介
- 2023年貴州黔南州人民檢察院招考聘用派遣制檢察輔助人員筆試題庫含答案解析
- 機械制造技術(shù)基礎(chǔ)課程設(shè)計講課用
- CMOS反相器的與設(shè)計
- 核醫(yī)學(xué)科儀器管理操作保養(yǎng)維修制度
- 《祝福》配套劇本 課件
- 電源板QC工程圖
- 小學(xué)數(shù)學(xué)小升初小升初專題復(fù)習(xí)小升初專題復(fù)習(xí)
- GB/T 8162-2008結(jié)構(gòu)用無縫鋼管
評論
0/150
提交評論