操作系統(tǒng)課內(nèi)實驗報告-西安交通大學(xué)_第1頁
操作系統(tǒng)課內(nèi)實驗報告-西安交通大學(xué)_第2頁
操作系統(tǒng)課內(nèi)實驗報告-西安交通大學(xué)_第3頁
操作系統(tǒng)課內(nèi)實驗報告-西安交通大學(xué)_第4頁
操作系統(tǒng)課內(nèi)實驗報告-西安交通大學(xué)_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實驗報告實驗課程:操作系統(tǒng)原理學(xué)生姓名:高君宇學(xué)號:2110505112專業(yè)班級:計算機(jī)15班2013年12月29日實驗一:用戶接口實驗一、 實驗內(nèi)容1) 控制臺命令接口實驗該實驗是通過“幾種操作系統(tǒng)的控制臺命令“終端處理程序“命令解釋程序”和“nux操作統(tǒng)的bah”讓驗理面作命的口hel和簡單的e編程。A查看ah本。A編寫ah本統(tǒng)計y目下c言件個數(shù)2) 系統(tǒng)調(diào)用實驗該實驗是過驗“nux操系的統(tǒng)用機(jī)進(jìn)步解理解系統(tǒng)用運(yùn)機(jī)時通自創(chuàng)立一統(tǒng)用cal〔程調(diào)自己創(chuàng)立系調(diào)”一掌握調(diào)系調(diào)的方A編程用個統(tǒng)用ok〔觀結(jié)A編程用系用oo〔,察果。A自己個統(tǒng)用ca〔,現(xiàn)能顯字符到幕。A編程用己系調(diào)用。二、實驗準(zhǔn)備為了用通操系完成項理作統(tǒng)必為戶供種口來人機(jī)互經(jīng)的作統(tǒng)理將作統(tǒng)接分為制命和統(tǒng)用兩者主要提算的作員對算進(jìn)各控而者提個序員使他可方便地用算的種源。三、源程序1、控制臺命令接實驗〔1查看bah版本在hel提符輸:$echoAHESON我們版是 4.237〕-reease〔2建立bah腳,出Heood在編器輸以內(nèi)容#bnbahechoeoord!執(zhí)行使指$.ext〔3編寫bah腳:計y目錄下c語文的個數(shù)通過ah本可有種方實這功,使用數(shù)其個個擇。在使函之,須定義數(shù)。進(jìn)入己工目,寫為cont的腳本序:#!bnbahuncon cunt{echo –n "Nuberofatchesor$1:" 接程的一參數(shù)s $1c–l #對程的第個數(shù)在目進(jìn)行}將ount件制前目后當(dāng)錄下立件在y錄下立幾個c件以用進(jìn)試2、系統(tǒng)調(diào)用實驗1)系統(tǒng)調(diào)是作為程員供接效勞用統(tǒng)序以更分利用計機(jī)使寫程序加功更強(qiáng)序在對統(tǒng)分了的下甚至以做統(tǒng)用實現(xiàn)些專程員難以現(xiàn)功時自創(chuàng)立個系調(diào)用cal〔”“編調(diào)自創(chuàng)立的統(tǒng)調(diào)”一掌創(chuàng)立和調(diào)系用的法。a.加代碼在ucnuxkenes.c文件添源碼如所示:alnkagent_o〔ntx〕{ pn〔“dn”x〕;}b.連新系調(diào)用進(jìn)入錄ucnuxncudea386,翻開件nd.h。這文 了系調(diào)的單用給每系調(diào)分一唯一號。進(jìn)入ucnuxache/386kene翻開文件nr.S。重新譯核配置核建使默配置僅修改loclvrsions即可然可把一無模塊掉〕makeenuonfg編譯核-jN中的N示使多個程譯一般處器目+〕makej5zImge編譯核makej5odues安裝核塊要rot權(quán)限〕提示模被裝/limoduls/vrsins下2..31內(nèi)在cofig時設(shè)其的localverios為mysvice么vesios為.6.31mysrvie〕sudoakemodlesinsll安裝核提示在的Linx版中自成int文件統(tǒng)并配文內(nèi)及in內(nèi)存件統(tǒng)貝/bot目下最更引。重啟完成上置,新動系進(jìn)自的系統(tǒng)2編調(diào)一系調(diào)用ok〔觀結(jié)#incude<stio.>itmin(){intiid;iUid=ork);if(iUd==)for(;) {pint("Tsisaret.\");slp(1);}if(iUd>0)for(;){print("Tisscildn");sleep1);}if(iUd<0) rinf("nnotusesysemalln");return0;}編程用系用oo〔,察果。#incldestdo.h>#incldelinx/uisth>_syscll1cha*,fo,i,ret)main(){intIJ;I=100;J=0;J=fooI);print("Tissterultofnewkeneln");print("%",j;}編程用己系調(diào)用。#incldelinx/uisth>syscal1(har,myallnt,re)intmin(){char*st;charstrng[0];str=trig;str=Thisstingwillbediplaed.;mycal(sr);retun0;} 附:內(nèi)核編譯編譯內(nèi)核的根本步驟〔1〕將vm和win共享的sharedfolders文件夾中的linux-3.0.5.tar.bz2拷貝到/usr/src目錄下更改用戶權(quán)限sudo–sa.進(jìn)入sharedfolders:cd/mnt/hfgs/sharedfolders/b.拷貝:cplinux-.tar.bz2/usr/src/〔2〕解壓linux源碼:進(jìn)入目錄/usr/srctarxvzflinux-.tar.bz2〔3〕進(jìn)入目錄linux-,輸入命令makemenuconfiga.fedora和Centos通過yuminstallncurses-devel解決b.Ubuttu和Debian通過sudoapt-getinstalllibncurses5-dev〔4〕在圖形界面中設(shè)置config,一般進(jìn)入GeneralSetup中修改一下內(nèi)核名稱即可〔5〕編譯內(nèi)核:make–j4bzImage(開4個線程編譯,如果是單核的cpu就不用加-j4參數(shù)了),編譯結(jié)束以后,出現(xiàn)Kernel:arch/x86/boot/bzImageisready(#1)那么說明內(nèi)核編譯成功〔6〕編譯模塊:make–j4modules(時間較長)〔7〕模塊安裝:makemodules_install〔8〕安裝內(nèi)核:makeinstall在高版本中,makeinstall命令會自動生成啟動文件,在低內(nèi)核版本中,需要添加。所以,我們還需要看一下有沒有生成啟動文件,如果沒有,那么需要自己手動添加?!?〕查看內(nèi)核是否添加:cat/boot/proc/proc.conf2、創(chuàng)立系統(tǒng)調(diào)用的根本步驟〔1〕在linux-/kernel下創(chuàng)立mysyscall.c文件,內(nèi)容如下:#include

<linux/kernel.h>

asmlinkage

long

sys_mysyscall(void){

printk(KERN_ALERT

"This

is

my

sys

call!\n");return

0;

}

(2)在linux-/kernel/Makefile中參加:obj-y

+=

mysyscall.o

(3)在linux-/include/linux/syscalls.h中參加:asmlinkage

long

sys_mysyscall(void);

(4)在linux-/arch/x86/kernel/syscall_table_32.S〔如果是64位機(jī)器那么32替換為64〕中參加:.long

sys_mysyscall

在linux-/arch/x86/ia32/ia32entry.S中參加:.quad

sys_mysyscall

(5)在linux-/arch/x86/include/asm/unistd_32.h中參加:#define

__NR_mysyscall

349

并將#define

NR_syscalls

349

替換為#define

NR_syscalls

350

〔這里根據(jù)實際情況,__NR_mysyscall為現(xiàn)有最大值,NR_syscalls加一即可〕(6)重新編譯、安裝、重啟(7)測試查看/proc/kallsyms中是否有mysyscall,如果有,表示符號已經(jīng)導(dǎo)出。編譯運(yùn)行,輸出0即為正確,-1為錯誤。

假設(shè)運(yùn)行正確,用dmesg查看,末尾有輸出:Thisismysyscall!編譯內(nèi)核成功截圖:2、編譯模塊成功截圖:實驗出的題:在進(jìn)內(nèi)編時首遇到困就將少程序入但為省Uanu帶的編器不輸過程就費(fèi)非大時最經(jīng)學(xué)的助順完。在編期有歷一多小的間最編成功在寫用序進(jìn)行證過程中,能過己網(wǎng)查找料并鑒學(xué)作法最完。四、實驗體會通過次們了面操命的口e學(xué)了單的el碼理解了操系調(diào)的行制掌了系調(diào)的方本實驗過核編將組源代變操系的核由重引系統(tǒng)這讓們步解操系統(tǒng)生過程。實驗二:進(jìn)程管理實驗一、實驗內(nèi)容1) 編制實現(xiàn)軟中斷通的使系調(diào)用ok創(chuàng)立兩個進(jìn),用統(tǒng)用gna讓進(jìn)捕盤上出的中信〔按deee鍵當(dāng)進(jìn)接到個軟斷某個,進(jìn)程系用k)向兩子程發(fā)出數(shù)為6和17中斷進(jìn)獲應(yīng)軟斷號,然后別出息終止:Chdpoes1siedbypaentChdpoes2siedbypaent父進(jìn)用a函數(shù)兩個進(jìn)終后輸以下息結(jié)進(jìn)執(zhí)Paentpoessed多運(yùn)幾編的序簡略析現(xiàn)同果原因。2) 編制實現(xiàn)進(jìn)程的管通的程序使用統(tǒng)用ppe建條管線兩子程別向道一話:Chdpoes1sedngaeage!Chdpoes2sedngaeage!而父程從道讀來自兩子程信,顯在幕。要求父程接子程P1發(fā)的息然接收程P2發(fā)的。二、實驗分析1、程中實法程:相關(guān)數(shù):wai函數(shù)a函數(shù)常來制父程與進(jìn)的步在進(jìn)程用a函數(shù)父進(jìn)程被塞進(jìn)等隊,等子程束當(dāng)進(jìn)程束,生個止?fàn)钕到y(tǒng)向進(jìn)出SGHD信接信父進(jìn)提子程終狀態(tài)從a函數(shù)回續(xù)原來程其調(diào)格為:#ncude<yye.h>#ncude<ywa.h>pd_)wan*aoc正確回于0子程的程D。等于,。錯誤回等于1調(diào)失敗。ex)函數(shù)ex函數(shù)是程束常調(diào)的數(shù)在an函數(shù)中用eu終調(diào)用ex函數(shù)這都進(jìn)的常終。正終時x)函數(shù)返進(jìn)結(jié)態(tài)。其調(diào)格為:#ncude<doh>vodexntau其中,aus為程束態(tài)。l)函數(shù)k)函數(shù)用刪執(zhí)的程或任。其調(diào)格為:lntPD,ntD其中PD要?dú)⑦M(jìn)程,D為向被的進(jìn)發(fā)中中號。Sgna)函數(shù)gna函數(shù)允調(diào)程控軟斷號處其調(diào)格為:#ncude<ga.h>ntg;vodfuncgnag,fncon2.管實管道是用連一個進(jìn)和個進(jìn)以實它之信的享文稱ppe文件。向管道〔共享文〕提供輸入的發(fā)送進(jìn)程即寫進(jìn)程,以字符流形將大量的數(shù)據(jù)送入道而收道送的收程讀程可以管中收據(jù)。為協(xié)雙的信,道信制須供下3面協(xié)能:A 互斥當(dāng)個程對ppe程讀操時一進(jìn)必等。序使用ockd1,1,0數(shù)現(xiàn)管道加操用ockd1,0,0除道鎖定A 同寫程一量的據(jù)入pe去睡等直讀取走數(shù)據(jù)后再它喚進(jìn)程圖一管中取數(shù)時也應(yīng)眠直至寫進(jìn)將據(jù)入道,才其醒。A 判斷方否確定進(jìn)和進(jìn)都在的況才通道進(jìn)行通信。在程中使父進(jìn)創(chuàng)立兩子程其中個管中數(shù)一從道中讀據(jù)父程制寫的斥同。用道鎖制制次或次讀互。父進(jìn)創(chuàng)立子程,之向道寫據(jù)寫后,束進(jìn)程1并父進(jìn)發(fā)斷,父進(jìn)收中信再創(chuàng)立子程子程2從道讀后結(jié)并父進(jìn)程中。三、源程序1、程中:#ncue<doh>#ncude<na.h>#ncudeund.>#ncude<tpe.h>nta_ag;odop(an(){ntpd1,pd2; /定義個程變量gna3,op; /或者gna14,ophepd1=ok()=1; /假設(shè)創(chuàng)立子程1不功那么空pd1>0){hepd2=ok()=1/子進(jìn)創(chuàng)立成功,p1進(jìn)程號創(chuàng)立進(jìn)程2pd2>0){a_ag=1;ep5/父進(jìn)等待5秒kpd1,16kpd2,17a0a0/殺進(jìn)程1/死程2/等待第1子程1束的號/等待第2子程2束的號pnnPaentpoesskedn);ex0; /父程束}ee{a_ag=1;gna17,op; /等待程2被死斷號7pnnChdpoces2skedbypaentnex0}}ee{a_ag=1;gna16,op; /等待程1被死斷號6pnnChdpoces1skedbypaentnex0}}odop(){a_ag=0;}實驗結(jié)果:實驗結(jié)果簡要分析:述果“hdpces1skedbypaent”“hdpoces2skedbypaent”繼現(xiàn)當(dāng)行幾后誰前在是隨的這因:進(jìn)程度角度看子程創(chuàng)立后于就態(tài)此進(jìn)和子程為個立進(jìn)程共同一個代段分參調(diào)執(zhí)至程束但是會被度序中執(zhí)與系統(tǒng)的度略系當(dāng)?shù)馁Y狀有不定的因先從ok函數(shù)返續(xù)執(zhí)后的句是確定2、道#ncudeund.>#ncude<na.h>#ncude<doh>ntpd1,pd2;an){ntd2caruPpe100,Ppe100ppedhepd1=ok)=1pd1==0){ockd1,,0pnOuPe,hdpoces1sendgeagened1,OuPe,50eep5ex0}ee{a0hepd2=k)==1pd2=0){eadd0,Ppe,50pnn,nPpepnChdpoces2secengeagenockd0,0ex0}ee{a0ex0}}}運(yùn)行果:四、實驗體會通過次驗我理了進(jìn)的質(zhì)進(jìn)管的機(jī)程操系中最要的概念是代作統(tǒng)鍵驗我在nux系統(tǒng)下現(xiàn)程創(chuàng)立到止的過體會進(jìn)的程父進(jìn)和進(jìn)的系進(jìn)程態(tài)變、程間的步進(jìn)程度原和信和管為表進(jìn)間信方的現(xiàn)。實驗三:存儲器管理實驗一、實驗內(nèi)容比照下種法命率:1) 先進(jìn)出法O〔stntOut〕2) 最近少用法ReatRecenlyUe〕3) 最近使法RNerUedRcen〕4) 最正確換法PTOpalRepaceen〕二、實驗分析1置換法原理* O原理簡述〔1〕在分內(nèi)頁P(yáng)小天程面PP當(dāng)是先行的P個頁面入存;〔2〕這時需處新頁,那么原放內(nèi)中的P個中先入出〔O,再將頁放;〔3〕以后果有頁需調(diào)入那么按述那么行?!?〕算法點所用內(nèi)頁面成個列。*RU算原簡述〔1〕當(dāng)內(nèi)分頁P(yáng)小于程面PP把先行的P面放入存。〔2〕當(dāng)需調(diào)頁面進(jìn)入內(nèi),當(dāng)前分配的內(nèi)存頁全不空閑時,選擇將中時間有到那頁出,空內(nèi)來置調(diào)入頁〔RU算法點每頁都屬性表有長間被PU使的息。*UR算原簡述所“近使用首是要近做個CERPRO=0是指在PU的50次程頁處工有處到頁那能會以幾種情況:〔1〕如果樣頁只一,就其出放需處理新面。〔2〕如果有這樣的頁面止個,就在這些頁面任一個換出〔可以是標(biāo)的或最的,入處理頁如果有個樣頁,就意出個面可以下最的者大的*PT理述所謂最正確算是種想狀下算,要先遍所的PU處的進(jìn)頁列。這頁中如有些經(jīng)內(nèi)中而PU不處的就其出;有頁面已內(nèi)而PU即處從前置最才處到面將換。2.OT算法實現(xiàn):為每進(jìn)頁設(shè)間性Dance表示PU在幾處到頁如果頁面不被PU處,可以被設(shè)某個很大值〔如376,樣每被換出的是cDance最的個〔1〕初始置個組paeap和pgeconopp分表示程面和存分配的面產(chǎn)一機(jī)數(shù)列anoa_nuco]

這個由pageap]的下隨構(gòu)示處理進(jìn)頁順dect置0后描頁面訪問序,對DancOA_P數(shù)進(jìn)行賦,表示該面將第幾步被處〔2〕看列an中是否一個素如有由an中獲取一個PU處理的面,轉(zhuǎn)3如果有轉(zhuǎn)6〔3〕如果頁已在存了,轉(zhuǎn)2否轉(zhuǎn),時deect加?!?〕看是否有空閑頁,如有,就返回頁面針,轉(zhuǎn)到〔5,否那么,遍未處的程面列如果位內(nèi)中頁而后PU不處首將其出返頁指如果有樣頁出PU將晚理頁將其出并回頁指針?!?〕在內(nèi)頁和處的程頁之建聯(lián),〔2〔6〕輸出算1deect/oa_nucon100的結(jié)完成。三、源程序#ncude<oea>#ncude<n>#ncude<eco>#ncudecdb>#ncudecdo>#ncudeund.>ungnaepaced;#deneNAD1contntOA_NSTUTON30contntOA_P32contntCEAPRD50#ncudePage.h"#ncudePagCono.h"#ncudeeor.h"ntan(){ntCeorya;o=4<=2++){a.O);a.RUaNRaPTcou<n;}eun0;}#ndef_YH#dene_EOYHcasCeory{pubc:Ceorodnazecontntnoa_podOcontntnoa_podRUcontntnoa_odNRcontntoa_odPTontntnoa_pae:eco<Pae>_DPage;eco<PaeCno>_eorPage;PaeCnol_peep_head,_pBusp_head,_pBup_aeco<n>_an,_Pge_Oent_nDeec;CeorCeor)_DcPgeA_P,_eorPageO_VP,_anA_NSUTON,_PageOA_NSTUTON,_OeOA_NSRTON){ntS,,nRad;andgepd10nRad=ad3267;S=oa319nRand32671;o=0<A_NSCTN+4){_an=S;_an+1=_an+1;nRad=ad3267;_an+2=oa_an]nRand32767;_an+3=_an+21;nRad=ad3267;S=oanRnd318_an+23276+_an+2+2;}o=0<A_NSCTN++){_Page_an10;_Oe=_an10;_Page=32;}}odCeor:ntazecontntnoa_p{ntx;_nDeec=0;ox=0x<_DPage.ex++){_DcPagex._nPagube=x;_DcPagex._nPageaceNube=AD;_DcPagex._nCone=0;_DcPagex._ne=1;}ox=1x<oa_px+){_eorPagex1._pNex=_eorPagex_eorPagex1._nPageaceNube=x1;}_eorPagenoa_p1._pNexU;_eorPagenoa_p1._nPaeaceNube=noa_p1;_peep_head=_eoPage0}odCeor::Ocontntnoa_p{ntPaeCnolp;nazenoa_p_pBup_head_Bup_ta=U;o=0<A_NSCTN++){_DcPge_Page._nPageaceNube=NAD){_Deec+=1;_peep_hea=U) /noeptypages{p_Bup_head>_pNex_DPage_pup_head>_nPagNube._nPgeaceNube=NAD;_peep_head_pupf_head;_peep_head>_pNex=U;_Bup_head=p;}p_peep_head>_pNex_peep_head>_pNex=U;_peep_head>_nPgNube=_Page_DcPage_Page._PageaceNube=_peep_head>_nPgeaceNube_Bup_a==U)_pBup_head_Bup_ta=_peep_head;ee{_Bup_al>_pNex=_peep_head;_Bup_a=_peep_head;}_peep_headp;}}cou<"O:<<1oa_nDeec320;}odCeor::RUcontntnoa_p{nt,,nn,n,nPeene0nazenoa_po=0<OA_NSTUTON+){_DPge_Pge._nPageaceNube==AD){_Deec++;_peep_head=U){n=3277;o=0<OA_P+)getheubcbeofheeatuedpaeaerheeccenshenuberofiesuedofheeatuedpgehenjstsubcbenn>_DPage._ne_DcPae._PageaceNube=D){n=_DPage._ne;n=}_peep_head=_eorPage_DPagenj._nPgeaceNube_DPagen._PageaceNube=AD;_DPagen._ne=1;_peep_head>_pNex=U;}_DPage_Pge._nPageaceNube=preep_head>_Pageaceube_DPage_Pge._ne=nPeene;_peep_head_peep_head>_pNex}ee_DcPage_Page._ne=Peene;Peene++;}cou<RU:<<1oa)_nDeec320;}odCeor:NURontntnoa_p{nt,,nDPae,OdDcPage;boolCon_ag;nazenoa_pDPag=0;o=0<OA_NSTUTON+){_DPge_Pge._nPageaceNube==AD){_Deec++;_peep_head=U){bon_ag=ue;OdDPag=DcPage;hebCon_ag){_DcPageDPage_nCoune=0_DPagenDPage._PageaceNube=NAD)Con_a=ae;ee{DPag+;DPae=OA_P)DPag=0;DPae=O_DPge)o=0<A_P++)_DPage._nCune=0;}}_peep_head=_eorPage_DPagenDPge._nPageaceNbe_DPagenDPage._nPgeaceNubeNAD;_peep_head>_pNex=U;}_DPage_Pge._nPageaceNube=preep_head>_Pageaceube_peep_head_peep_head>_pNex}ee_DcPage_Page._nCone=1;CERPRD=0)o=0<A_P++)_DPage._nCune=0;}cou<R<<1oa)_nDeec320;}odCeor:OPTcontntnoa_p{nt,,ax,axpage,Dance,DanceOA_Pnazenoa_po=0<OA_NSTUTON+){_DPge_Pge._nPageaceNube==AD){_Deec++;_peep_head=U){o=0<OA_P+)_DcPage._Pageaceube=NAD)Dance=3267;eeDance=0;Dance=1;o=+1<A_NSTCTN++){_DcPage_Page_nPageaceNube=ADDance_Pae==3267Dance_PageDance;Dance+;}ax=1;o=0<OA_P+)(ax<Dance{ax=Danceaxpag=}_peep_head=_eorPage_DPageaxpage._nPageaceNbe_peep_head>_pNex=U;_DPageaxpae._nPageaceNube=AD;}_DPage_Pge._nPageaceNube=preep_head>_Pageaceube_peep_head_peep_head>_pNex}}cou<P<1oa)_nDeec320;}實驗結(jié)果:四、實驗體會通過次驗我理了內(nèi)頁調(diào)的制掌握幾理頁置算法實現(xiàn)方法了了AH結(jié)構(gòu)使。面換法是擬儲理現(xiàn)關(guān)鍵,O、RUU和PT是經(jīng)典面換法我通過現(xiàn)幾算了各頁面置算的率優(yōu)點,而解虛存實現(xiàn)過實驗四:文件系統(tǒng)實驗一、實驗內(nèi)容2) 設(shè)計實一一〔用戶文系程序a.提以操A 文件除口令ceaedeeeA 目錄除口令kddA 顯示錄容令sb.創(chuàng)立的件要格和內(nèi)容3) 設(shè)計實一二文系統(tǒng)a.提用登b.文、錄有二、實驗分析1.路:用一文〔dsk.xt模擬個理盤,通對該件一列作模擬UN文件統(tǒng)的件作。2.磁塊設(shè)卷盤數(shù)于10塊每磁盤51字節(jié)磁塊間用n開共是14節(jié)0#表示超,1--10放結(jié)點,個引結(jié)占6字節(jié),80索引點初始化存在根錄rot占了0點和1#塊。3.閑盤:采用組接管組101#--9#為9每的后個盤里存下一組磁號息最一組有塊上作結(jié)束志在塊用個一數(shù)〔10個元〕為閑盤棧。入一盤。4.閑I結(jié)點采用混合索引式文件結(jié)構(gòu)。索引結(jié)點結(jié)構(gòu)中文件物理地址為六項:四個直接塊號,一個一間址一個次址,中一間址兩間址一個盤塊存放6個磁號。在超中用維0個素作空閑I棧與閑盤塊理同的這不用采成鏈法這維數(shù)中放有I結(jié)編且直保同大小目錄占0索結(jié)于錄不刪一占0引結(jié)以并按指導(dǎo)說,把它在塊,過進(jìn)去無謂5.級,I結(jié)和結(jié)構(gòu)設(shè)計structSUERBOCK/塊{intfitac[80//空結(jié)號棧intfitr;/結(jié)點指(有少個)intfbtac[10//空盤號棧intfbtr;/結(jié)點指針intinm;/閑i結(jié)總數(shù)intbnm;/空盤塊數(shù)};structINDE/i點(B) 保了兩數(shù)之間空隔開{intfsze;/大小intfbum;/盤塊數(shù)intadr[4;/個直盤號(0~12*=2048)intadr1;/一次址()intadr2;/兩次址()chroner6];文件有者chrgoup6];文件屬組chrmde[1];/文類及儲chrcime9];最近改間};structDI//錄(36{chrfame14]/文名(前錄)intinex;/i點號chrprfnme[];//目名intpaindx;/父錄i點號};6.戶密和組戶信是放一個件(sertxt中各個要能數(shù)說明1.mai.cp:是程的函模塊主函首會據(jù)制件cntrl.tt的一位〔始確位來定是進(jìn)行初化如初化那么只一根錄因為旦始后初化確位會置為0以統(tǒng)會第次進(jìn)時始后是在面立文結(jié)上進(jìn)操的。如果定系初化,把cotro.txt的一個置1或使令“rse進(jìn)入系統(tǒng)時,當(dāng)前路徑是根目錄。然后是登陸請求。登陸后,超塊讀入內(nèi)存〔由一個結(jié)構(gòu)象upeblok入令析戶的同令行同操出系統(tǒng)前把存超再回dik.tt。2.hea.h:程的有局量、構(gòu)函聲的塊。包了有用的系庫。3.blokindesperloch:是定有超、點盤塊目項底操函數(shù)模。1.結(jié)的作:intillo(vod);申請個i結(jié)點回號那么回-。返回是閑點棧最小結(jié)號結(jié)用時返-1申失。voidfre(intinex);指定個點,收個i點。先清結(jié),后入中適宜位〔須持點號有性voideadnod(intinx,INOE&nod);讀指的i結(jié)( #,讀針定到54+6n(6B)+*(n8)到IOEino存放 便對一點大量voidritinoe(IODEnode,ntnde);把INDEnode寫指的i點2.盤的作用成組接。(#塊指針定到54*n)intbllo(vod);申請個塊返盤號 否返-1voidfre(intinex);指定個塊,收個盤塊3.超的作;voideadupe(vod);讀超到存UPEBLOKsupeblok;voidritsupr(vid);內(nèi)存UPEBLOKsperock;回塊4.目項操作( n目錄讀針定514ndex+6*n )voideadir(NODEine,intindx,DR&ir);讀指目項臨象DIRdr;voidritdirINOEide,DIRdi,intinex);目錄象DIRdir寫指定錄項4.iniialh:是定初化數(shù)模塊其中括對戶的始化定三用戶dm,cj和jtq其中dm,nj為adm,jtq組為ges。戶初始碼為13對的〔0盤〕始化根目文件結(jié)點0#點的始化、對據(jù)塊初化。5.useop.:定義兩功函1.陸 oollogn(vd);求入戶息并判是合2.變戶碼vidangepsswrd(oid;變當(dāng)用的碼。6.fie.h:定義有文操的個函數(shù)1.件vidk(cr*dinam,chr*ontt);當(dāng)前目錄下創(chuàng)立一個數(shù)據(jù)文件(規(guī)定目錄文件只占1~4個盤塊)。雖然不要求這個函我得有且因我用個參前個示名后一個示件容可在文拷里用個數(shù)。2.除件vidm(cr*fienae);前錄刪指定據(jù)3.件貝vidp(cr*strng);定個徑把那文拷到前錄下首要用di.h里面據(jù)徑找到目的〔fid(ca*strig到應(yīng)果數(shù)文的記錄內(nèi)容一沖,后當(dāng)前錄調(diào)創(chuàng)立目的函,完了。4.示件容vidt(char*flenme);示前錄指定據(jù)件內(nèi)。7.di.h:定義個層數(shù)1.bolhvesme(hardirnae,IODEinoe,it&i,it&nde2)判斷象node指的錄文盤中無irnam目項在有返回?zé)o回0同,該目項話那么引調(diào)的i待子錄錄項標(biāo)index為錄中待子目的點號2.bolfnd(har*stng)根據(jù)徑到定件目錄路至有個‘’以rot頭不‘’結(jié)尾>。要注的是使此函數(shù)當(dāng)路徑著掉了,以用前須存當(dāng)路徑。一不目的,可復(fù)原為前徑。定義有目操的個功函1.vodmdirchar*dname)當(dāng)前錄創(chuàng)立目(目錄件占個為了低設(shè)錄文件只一盤。2.vodrdirchar*dname,ntnde)當(dāng)前目錄下刪除目錄。將要刪除的目錄可能非空。有兩種策略:一、規(guī)定只能刪除空目錄。二、遞歸地將非空目錄的所有子目錄刪除,讓后再刪除自己。第一種實現(xiàn)較簡單,我使用了第二種策略。所以參數(shù)為(子目錄名,當(dāng)前結(jié)點)。如果使用第一種策略話參為要目錄就以3.vodl(vod)顯示前點所子4.vodc(chr*tri)改變前錄有中理過:trig“切換當(dāng)目;“.”切換到父目錄;為“”切換到根目錄;如果為一路徑的話,就調(diào)用boolfind(har*sting切到指目8.chomeh:定義個層數(shù):boolavepowr(IODEnode)判斷前戶指的點有寫定義個能數(shù):1.vodcmodchar*ne)改變前錄指文的文權(quán)限2.vodcownchar*ne)改變前錄指文的文擁者如有另一組那組要掉)3.vodcgrpchar*ne)改變前錄指文的文所組4.vodcnamchar*ne)改變前錄指文的文名9andh:令析函模。接用命,行同的作。實驗結(jié)果如下:single文件系統(tǒng)管理:double文件管理三、源程序1. ain.pp#inludehd.h"#inludeblokinodsupblok.h"#inludeinitil.h"#inludeuseop.h"#inludeil.h"#inludedi.h"#inlude"ommnd.h"#inlude"hsom.h"http://///////////////////////////////////////////////////////////////////voidmin{ontol.opn(ontol.txt,ios::in|ios::out|ios::noetinti;ontoli;ontol.losii0//不為0就初始化{initil}ontol.opn(ontrol.txt,ios::in|ios::out|ios::notontol.skp0ontol0;//默認(rèn)是上次根底上繼續(xù)下去不用再初始化ontol.losstp(unm,oot;//當(dāng)前目錄文件名為ootod[0]0;//當(dāng)前錄路徑存放從根目錄到這里的結(jié)點號)num1;//最后位od[num1]為當(dāng)目錄文件i結(jié)點號out<請登陸系統(tǒng)nwhil(loin)//登陸為止out<wrong!nout<" loginsuss<ndl;out<******lome<use<******dsupetommnd;//命令解析函數(shù)writsup(}2. lokindsuplok.h/////////////////////////////////////////////////////////////////////intillo//申請一個i結(jié)點返回結(jié)點號否那么返回{isupblok.ipt>0){inttmpsuprblok.istk[80supblok.ipt];//當(dāng)前可用supblok.istk[80supblok.ipt]1;supblok.ipttuntmp;}tun1;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidiintindx//指定一個結(jié)點號,回收一個i結(jié)點{disk.opndisk.txt,ios:in|ios::out|ios::note;//清空結(jié)點disk.skp(51464*indx2*indx8diskstw64<'disk.losointi80supblok.ipt;i80;i+//結(jié)點號找到適宜位置插入空閑結(jié)點號棧{isuprblok.istk[i]indx/小于它的前移一位{supblock.istk[i1]supblok.istk[i];}ls//放在第一個大于它的結(jié)點號前面{supblock.istk[i1]indx;bk;}}supblok.iptr}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*成組鏈接法*/intbllo//申請一個盤塊返回盤塊號 否那么返回{inttmpsupblok.bstk[10supblok.bpt];isupblok.bpt1//是棧底了=>是記錄盤塊了{(lán)//是最后記錄盤塊最后號0〔保存作棧底分配不成功〕itmp0){tun1;}supblok.bstk[10supblok.bpt]1;supblok.bpt0;//盤塊內(nèi)容讀入棧ointi0;i10;i{intid,num0;disk.opndisk.txt,ios::in|ios::out|ios::note//先計算盤塊內(nèi)容個數(shù)num〔最多10,最后盤塊可能不到10個disk.skg514*tempointi0;i10;i{num}

diskid;iid=0) bek;disk.sk514*tmp;//盤塊內(nèi)容讀入棧ointj10num;j10;j{diskid;supblok.bstak[j]id;}suprblok.bptnum;disk.los}disk.opn"disk.txt,ios::in|ios::out|ios::noete;//清空回收盤塊disk.skp(514*tmpdiskstw512<'disk.los//盤塊使用掉tuntmp;}ls//不是記錄盤塊盤塊使用掉{supblok.bstk[10supblok.bpt]1;supblok.bpttuntmp;}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidbintindx//指定一個盤塊號,回收一個盤塊{disk.opndisk.txt,ios:in|ios::out|ios::note;//清空回收盤塊disk.skp(514*indxdiskstw512<'disk.losisupblok.bpt10//棧已滿棧中內(nèi)容記入回收盤塊棧清空{(diào)disk.opn"disk.txt,ios::in|ios::out|ios::noetedisk.skp514*indxointi0;i10;i{diskstw(3)supblok.bstk[i];suprblok.bstk[i]1;}disk.los;supblok.bpt0;}//回收盤塊壓棧supblok.bstak[10supblok.bpt1]indx;supblok.bptr}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voiddsupe//讀超塊到內(nèi)存{disk.opndisk.txt,ios:in|ios::out|ios::noteinti;oi0;i80;i+)//讀空閑結(jié)點號棧{disksupblok.istk[i];}disksupblok.ipt;//空閑結(jié)點號棧指針oi0;i10;i//讀空閑盤塊號棧{disksupblok.bstk[i];}disksupblok.bpt;//空閑盤塊號棧指針disksupblok.inum;//空閑結(jié)點總數(shù)disksupblok.bnum;//空閑盤塊總數(shù)disk.los}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidwritsup(//內(nèi)存寫回超塊{disk.opndisk.txt,ios:in|ios::out|ios::noteinti;oi0;i80;i+)//寫空閑結(jié)點號棧{diskstw(3)supeblok.istk[i];}diskstw(3supeblok.ipt;//空閑結(jié)點號棧指針oi0;i10;i//寫空閑盤塊號棧{diskstw(3)supeblok.bstk[i];}diskstw(3supeblok.bpt;//空閑盤塊號棧指針diskstw(3supeblok.inum;//空閑結(jié)點號總數(shù)diskstw(3supeblok.bnum;//空閑盤塊號總數(shù)disk.los}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voiddinodintindxNODEinod//讀指定的i結(jié)點到NOEinode存放 便于對同一結(jié)點的大量操作{disk.opndisk.txt,ios:in|ios::out|ios::notedisk.skg51464*indx2*indx/8diskinod.siz;//文件大小diskinod.bnum;//文件盤塊數(shù)>目錄文件為1數(shù)據(jù)文件1~4都有ointi0;i4;i//四個直接盤塊號diskinod.dd[i];diskinod.dd1;//一個一次間址=>不使用了diskinod.dd2;//一個兩次間址=>不使用了diskinod.own;//文件擁有者diskinod.goup;//文件所屬組diskinod.mod;//文件類別及存儲權(quán)限diskinod.tim;//最近修改時間disk.los}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidwritinod(NODEinod,intindx//把NODEinode寫回指定的i結(jié)點{disk.opndisk.txt,ios:in|ios::out|ios::notedisk.skp51464*indx2*indx/8diskstw6inod.siz;//文件大小diskstw(6<inod.bnum;//文件盤塊數(shù)>目錄文件為1數(shù)據(jù)文件1~4都有

ointi0;i4;i//四個直接盤塊號diskstw(3)inod.dd[i];diskstw(3<inod.dd1;//一個一次間址=>不使用了diskstw(3<inod.dd2;//一個兩次間址=>不使用了diskstw(6<inod.own;//文件擁有者diskstw(6<inod.oup;//文件所屬組diskstw(12inod.mod;//文件類別及存儲權(quán)限diskstw(10<inod.tim;//最近修改時間disk.los}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidddir(NODEinod,intindx,DRdi//讀指定目錄項〔inode的盤塊,下標(biāo)indx〕進(jìn)臨時對象清空源{disk.opndisk.txt,ios:in|ios::out|ios::notedisk.skg(514*inod.dd[0]36*indxdiskdi.nmdiskdi.index;disk>di.prnmdisk>di.pindx;disk.skp(514*inod.dd[0]36*indxdiskstw(15<'diskstw(3)<'diskstw(15<<'diskstw(3<<'disk.los}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidwritdi(NODEinod,DRdi,intindx//錄項對象寫到指定目錄項{disk.opndisk.txt,ios:in|ios::out|ios::notedisk.skp(514*inod.dd[0]36*indxdiskstw(15di.nmdiskstw(3)di.indx;diskstw(15<di.pnmdiskstw(3<di.pindx;disk.los}/////////////////////////////////////////////////////////////////////3and.h/////////////////////////////////////////////////////////////////////voidtommnd)//命令解析函數(shù){hrommond10];boolhvo;;//接受并解釋命令{hv=als;//記錄命令接受否out<'npintodout<>incommond;i(stmpommond,d)//改變當(dāng)前目錄****(文件名切換到子目錄..切換到父目錄/切換到根目錄須切換到目錄文件{hvtue;hrstin[100];//<是路徑的話至少有一個‘/’以oot開頭不以‘/’結(jié)尾>}

instindstini(stmp(ommond,mksom)//構(gòu)建根本文件結(jié)構(gòu){hvtue;out<bin; mkdi(bin"out<"ndv; mkdi(dv"out<"nlib; mkdilibout<"nt; mkdi("tcout<"nus; mkdi(usrout<"ntmp; mkditmp}/*當(dāng)前目錄下的操作*/i(stmpommond,mkdi)//創(chuàng)立目錄****(規(guī)定目錄文件只占一個盤塊當(dāng)前目錄下創(chuàng)立{hvtue;hrdinam[14];indinmmkdidinm}i(stmpommond,mdi")//刪除目錄****當(dāng)前目錄下刪除1.只能刪除空目錄2.提醒+刪除所有子目錄>{hvtue;hrdinam[14];indinmmdidinm,od[num1]}i(stmpommond,mk)//創(chuàng)立數(shù)據(jù)文件****規(guī)定目錄文件只占1~4個盤塊當(dāng)前目錄下創(chuàng)立{hvtue;hrilnm[14];inilnm;//理論上可輸入1~4盤塊的內(nèi)容hrontnt[2048];out<請先輸入文件內(nèi)容1~2048位:inontnt;mkilnm,ontnt}i(stmpommond,p)//文件拷貝****把指定目錄下的指定文件拷貝到當(dāng)前目錄下){hvtue;hrstin[100];//<路徑至少有個‘/’以oot開頭,不以‘/’結(jié)尾>instinpstin}i(stmp(ommond,m")//數(shù)據(jù)文件刪除****當(dāng)前目錄下刪除{hvtue;hrilnm[14];inilnmmilnme據(jù)文件)

}i(strmpommond,"t)//顯示文件內(nèi)容(當(dāng)前目錄下指定數(shù){hvtue;hrilnm[14];inilnmtilnm}i(stcmpommond,hmod)//改變文件權(quán)限{hvtue;hrnme[14innmhmodnm}i(stcmpommond,hown")//改變文件擁有者如擁有者在另一個組,那么組也要改掉){hvtue;hrnme[14innmhownnme}i(stmp(ommond,hp)//改變文件所屬組???){hvtue;hrnme[14innmhgpnm}i(stmp(ommond,hnm)//改變文件名{hvtue;hrnme[14innmhnmnme}//////////////////////////////////////////////////////////////////*對當(dāng)前目錄的操作*/i(stcmpommond,pwd)//顯示當(dāng)前目錄{hvtue;out<"您的當(dāng)前目錄為:<cunm}i(strcmpommond,ls")//顯示所有子目錄必須保證是目錄文件){hvtue;ls}//////////////////////////////////////////////////////////////////*用戶組操作*/i(stmp(ommond,loin)//用戶登陸切換用戶{hvtue;out<帳號<usr<已注銷nwhil(loin))out<wrong!nout<loinsucss<ndl;out<******lome"aus<******}i(stmp(ommond,psswd)//改變用戶口令{hvtue;hnpsswod}i(stcmpommond,rst)//系統(tǒng)重〔調(diào)用初始化函數(shù)前有非正常退出時,一定要用{initil}

hvtuout<系統(tǒng)已重置i(stmp(ommond,xit)//退出{hvtue;tun;}i(hvelse//都不被接受{outommond<<"isnotalglommnd!!}}}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**/voidpintodvoid//根據(jù)結(jié)點路徑,輸出路徑{out<ootNODEinodintnxtindx;hrnm[14];ointi0;i1<num;i{dinod(od[i],inodedisk.opndisk.txt,ios:in|ios::out|ios::noteointj0;jinod.siz/36;j//遍歷所有的目錄項{disk.skg514*inod.add[0]36*jdisknmdisknextindx;inxtindxod[i1]){}disk.los);}}

out</outnmbk;}//////////////////////////////////////////////////////////////////////*boolissphar*st//判斷字符串是否全為空格{booltu;//檢驗參數(shù)有否檢驗是否全空格記錄在isspe中(空格不能當(dāng)參數(shù))ointi0;st[i]'0;i+{ist[i]'')als}}*/

tuna/////////////////////////////////////////////////////////////////////4.hso.h/////////////////////////////////////////////////////////////////////boolhvwpowe(NODEinod//判斷當(dāng)前用戶對指定的結(jié)點有無寫權(quán)限{i(stmp(us,inod.own)//是文件擁有者{}lse{

iinode.mod[2]wtuntutunflsi(stcmpgoup,inod.own)//是組內(nèi){iinod.mod[5]w')tuntutunls}ls//其他用戶{iinod.mod[8]w')tuntutunls}}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhmodhr*nm)//改變文件權(quán)限{NODEinod,inod2;dinodeod[num1],inod;//當(dāng)前點寫入結(jié)點對象inti,indx;//i為錄項下標(biāo)indx2為目項中結(jié)點號i(hvsmnam,inod,i,indx2)){dinodindx2,inod2i(hvewpowinod2)){hrmod[3];out<1表示擁有者4表示組內(nèi)7表示其他用戶a表示模式b表示x模式c表示x模式nout<請輸入修改方案例如4:inmodi(mod[0]1'||mod[0]4'||mod[0]7'){//intmod[0]49;強(qiáng)制類型轉(zhuǎn)換是轉(zhuǎn)成其ASCI碼i(mod[1]a'){inod2.mod[intmod[0]48]-inod2.mod[intmod[0]148]wwritinodinod2,indx2out<修改完畢}lse{

i(mod[1]b'){inod2.mod[intmod[0]48]rinod2.mod[intmod[0]148]writinodinod2,indx2;out<修改完畢}lse{

i(mod[1]'c'){inod2.mod[intmod[0]48]rinod2.mod[intmod[0]148]wwritinodinod2,indx2out<修改完畢otond;

}}lse{

}lse{}}

out<"輸入不合法;}}lse{

out<輸入不合法!; otond;}}lse{

out<你無權(quán)修改該子目錄或文件; otoend;out<不存在該子目錄或文件; otond;}//修改當(dāng)前i點和子結(jié)點hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.tim,tmpbuwritinodinod,od[num1]writinodinod2,indx2nd:tun;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhownhar*nme)//改變文件擁有者如擁有者在另一個組,那么組也要改掉){NODEinod,inod2;dinodeod[num1],inod;//當(dāng)前結(jié)點寫結(jié)點對象inti,indx;//i為目項下標(biāo)indx2為目錄中結(jié)點號i(hvwpowrinod)){i(hvsmnam,inod,i,indx2)){dinodeindx2,inod2i(hvwpowinod2)){hrown2[6];hrus2[6];hrroup2[6out<請輸入改后的文件所有者:inown2;boolisls; //判斷輸入的也是合法用戶名us.opn(use.txt,ios:ino( int n0;nusnum;n+ //用戶名18*n0~18*n5密碼18*n6~18*n1用戶組18*n12~18*n17{us.sek18*nus>us2;i(stmpown2,use2)){istuus.sek18*n12us>goup2;bk;}}us.losi(is){

stpinod2.own,own2stpinod2.oup,goup2writinodinod2,index2out<修改成功//修改當(dāng)前i結(jié)點和結(jié)點hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.tim,tmpbuwritinodinod,od[num1]writinodinod2,indx2}lse{

}lse{}

out<不存在該用戶,修改失敗out<"你沒有權(quán)限}}}lse{

lse{}

out<不存在該子目錄或文件out<你沒有權(quán)限}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhrphr*nme)//改變文件所屬組{NODEinod,inod2;dinodeod[num1],inod;//當(dāng)前結(jié)點寫結(jié)點對象inti,indx;//i為目項下標(biāo)indx2為目錄中結(jié)點號i(hvwpowrinod)){i(hvsmnam,inod,i,indx2)){dinodeindx2,inod2i(hvwpowinod2)){hrroup2[6hragoup2[6];out<請輸入改后的文件所所屬組:in>roup2;boolisls; //判斷輸入的也是合法用戶名us.opn(use.txt,ios:ino( int n0;nusnum;n+ //用戶名18*n0~18*n5密碼18*n6~18*n1用戶組18*n12~18*n17{us.sek18*n12us>aoup2;i(stmp(goup2,goup2)){}us.losi(is)

istubk;}{stpinod2.oup,goup2writinodinod2,index2out<修改成功//修改當(dāng)前i結(jié)點和結(jié)點hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.tim,tmpbuwritinodinod,od[num1]writinodinod2,indx2}lse

}lse{}

out<不存在該組,修改失敗{out<"你沒有權(quán)限}}}lse{

lse{}

out<不存在該子目錄或文件out<你沒有權(quán)限}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhnmhar*nme)//改變文件名{NODEinod,inod2;dinodeod[num1],inod;//當(dāng)前結(jié)點寫結(jié)點對象inti,indx;//i為目項下標(biāo)indx2為目錄中結(jié)點號i(hvwpowrinod)){i(hvsmnam,inod,i,indx2)){dinodeindx2,inod2i(hvwpowinod2)){hrnam2[14];out<請輸入更改后的文件名:innm2;disk.opn(disk.txt,ios::in|ios::out|ios::notedisk.skp(514*inod.dd[0]36*idiskstw(15)nme2;disk.los//如果是目錄文件,其下的所有目錄項都要改pnam[14]iinode2.mod[0]d{disk.opndisk.txt,ios::in|ios::out|ios::noteointi0;iinod2.siz/36;i//遍歷所有的目錄{disk.skg514*inod2.dd[0]36*i18diskstw(15)nm2;}disk.los}out<更改成功//修改當(dāng)前i結(jié)點和子結(jié)點hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.ctim,tmpbuwritinod(inod,od[num1]writinod(inod2,indx2}lse{}}

out<"你沒有權(quán)限}lse{

lse{}

out<不存在該子目錄或文件out<你沒有權(quán)限}}/////////////////////////////////////////////////////////////////////5.di.h//////////////////////////////////////////////////////////////////////**///當(dāng)前目錄unm〔肯定是目錄文件〕當(dāng)前i結(jié)點od[num1]voidmkdihr*dinam//創(chuàng)立目錄規(guī)定目錄文件只占一個盤塊)當(dāng)前目錄下創(chuàng)建{NODEinod,inod2;dinode(od[num1],inode;//把當(dāng)前i結(jié)點od[num1]內(nèi)讀入inodei(hvwpowr(inod)//判斷權(quán)限{i512inod.siz36//是否目錄項已到達(dá)最多14個{}lse{

out<當(dāng)前目錄已滿,創(chuàng)立子目錄失敗inti,indxi(hvsmdinm,inod,i,indx2)//有無重名存在著{out<該目錄已存在,創(chuàng)立失敗}ls//可以創(chuàng)立目錄{intiidillo;//申請結(jié)點i(iid1){intbibllo;//申請盤塊ibid!1){//當(dāng)前目錄盤塊的修改disk.opndisk.txt,ios::in|ios::out|ios::nortedisk.skp( 514*inod.dd[0]inod.sizediskstw(15)dinm;//寫目錄名diskstw(3)iid;//寫結(jié)點diskstw(15)<unmdiskstw(3)<oad[num1];disk.loshrtmpbu[9];

//當(dāng)前目錄i結(jié)點的修改inod.siz36;_sttimtmpbustpinod.tim,tmpbu//新創(chuàng)目錄i結(jié)點的初始化/**/inod2.siz0;//intsiz文件大小inod2.bnum1;//intbnum;件盤塊數(shù)inod2.dd[0]bid;//itdd[];四個直接盤塊號0~512*42048)沒有指向

ointa1;a4;a+//指向0#表示inod2.dd[]0;inod2.dd10;//intdd1;一個一次間址inod2.dd20;//intdd2;一個兩次間址

stp( inod2.own,usr ;stp( inod2.oup,aoup ;stp(inod2.mod,drwxxx";//hrmod[1];文件類別及存儲權(quán)限默認(rèn)最高)

_sttimtmpbustp(inod2.tim,tmpbuf;//hrtim[9];writinod(inod2,iid

/*disk.opndisk.txt,ios::in|ios::out|ios::nortedisk.skp51464*iid2*iid/8diskstw(6)0; //intsiz;文件大小diskstw(6)<1; //intbnum;文盤塊數(shù)diskstw(3)<bid;//intdd[4];四個直接盤塊號diskstw(3)0; //指向0#表示沒有指向diskstw(3)0;diskstw(3)0;diskstw(3)<0; //intdd1;一個一次間址diskstw(3)<0; //intdd2;一個次間址diskstw(6)<us; //hrown[6];diskstw(6)<aoup; //hrgoup[6];diskstw(12)<dxxx; //rmod[1];_sttimtmpbudiskstw(10)tmpbu; //hrtim[9];

disk.los;*/out<目錄已成功創(chuàng)立}lse{}

iiid;//剛申請的結(jié)點釋放掉out"盤塊已用完,創(chuàng)立子目錄失敗”;}lse}}lse{

{out<結(jié)點已用完創(chuàng)立子目錄失敗}}out<你沒權(quán)限創(chuàng)立}writinod(inod,od[num1];//把inoe寫入指定結(jié)點}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////boolhvsm(hr*dirnm,NODEinod,inti,intindx2//判斷對象inode指向的目錄文件盤塊中有無該名的目錄項存在著,有返回1無返回0{//有該目錄項那么按引用調(diào)用的i為待刪子目錄目錄項下標(biāo)indx2目錄項中的待刪子目錄的結(jié)點號boolhvflshrnm[14];disk.opndisk.txt,ios:in|ios::out|ios::noteoi0;iinod.siz/36;i//遍歷所有的目錄項{disk.skg514*inod.add[0]36*idisknami(stmpdinm,nam)){}disk.lostunhv}

hvtudiskindx2;bk;}/////////////////////////////////////////////////////////////////////intt0;//記錄遞歸重數(shù)入口加1出口減1/////////////////////////////////////////////////////////////////////voidmdihr*dinam,intindx//刪除目錄當(dāng)前目錄下刪除參數(shù)為子目錄名,當(dāng)前結(jié)點){tNODEinod,inod2;DRdidinodeindx,inod;//當(dāng)前結(jié)點寫入結(jié)點對象i(hvwpowrinod)//判斷權(quán)限{inti,indx;//i待刪子目錄目錄項下標(biāo)indx2為目錄項中的刪子目錄的結(jié)點號i(hvsmdinam,inod,i,indx2)//存在該子目錄名{dinodeindx2,inod2;//待刪子目錄的結(jié)點寫入結(jié)點對象i(hvwpowinod2)//判斷權(quán)限{i(inod2.mod[0]d'//判斷要刪除的是目錄文件而非數(shù)據(jù)文件{i(inod2.siz0//判斷待刪子目錄有無子目錄有{hres='';

//out該目錄非空,不能刪除it1){out<"該目錄非空,如果刪除的話,將失去目錄下所有文件,要繼續(xù)?(/n)in>s;}i( (s=='')||(es=Y') ){遞歸將其刪除

hrnm[14];

//遍歷待刪子目錄inod2)所有子目錄,intinx3;NODEinod3;ointi0;iinod2.siz/36;i//遍歷所有的目錄項{disk.opndisk.txt,ios::in|ios::out|ios::noctedisk.skginod2.dd[0]*51436*idisknamdisk.los

diskindx3;dinodeindx3,inod3iinod3.mod[0]d//是目錄文件{mdinm,indx2}ls//是數(shù)據(jù)文件{mnm}}mdidinm,indx;//子目錄空了再刪除自己}lse{out<目錄刪除失敗}}ls/

溫馨提示

  • 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

提交評論