版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)課程設(shè)計報告:Linux二級文件系統(tǒng)設(shè)計操作系統(tǒng)課程設(shè)計報告操作系統(tǒng)課程設(shè)計報告專業(yè):計算機(jī)科學(xué)與技術(shù)學(xué)號:********姓名:***提交日期:2013-3-8【設(shè)計目的】(1)本實驗的目的是通過一個簡單多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實現(xiàn)。(2)結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計、計算機(jī)原理等課程的知識,設(shè)計一個二級文件系統(tǒng),進(jìn)一步理解操作系統(tǒng)。(3)通過分對實際問題的分析、設(shè)計、編程實現(xiàn),提高學(xué)生實際應(yīng)用、編程的能力【設(shè)計內(nèi)容】二級文件系統(tǒng)設(shè)計【實驗環(huán)境】C++/VC++【相關(guān)知識綜述】1.背景知識(1)外存管理文件系統(tǒng)是一個含有大量的文件及其屬性,對文件進(jìn)行操作、管理的軟件,以及向用戶提供使用文件的接口的一個集合。在邏輯上它的層次結(jié)構(gòu)是這樣的:文件系統(tǒng)接口對對象的操作和管理的軟件集合邏輯文件系統(tǒng)基本I/O管理程序(文件組織模塊)基本文件系統(tǒng)(物理I/O層)I/O控制層(設(shè)備驅(qū)動程序)對象及其屬性說明作為產(chǎn)品的操作系統(tǒng)有各自的文件系統(tǒng)。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系統(tǒng)、LINUX使用的是EXT2、EXT3文件系統(tǒng)等等。(2)linux的EXT2文件系統(tǒng)linux使用一個叫虛擬文件系統(tǒng)的技術(shù)從而可以支持多達(dá)幾十種的不同文件系統(tǒng),而EXT2是linux自己的文件系統(tǒng)。它有幾個重要的數(shù)據(jù)結(jié)構(gòu),一個是超級塊,用來描述目錄和文件在磁盤上的物理位置、文件大小和結(jié)構(gòu)等信息。inode也是一個重要的數(shù)據(jù)結(jié)構(gòu)。文件系統(tǒng)中的每個目錄和文件均由一個inode描述。它包含:文件模式(類型和存取權(quán)限)、數(shù)據(jù)塊位置等信息。 一個文件系統(tǒng)除了重要的數(shù)據(jù)結(jié)構(gòu)之外,還必須為用戶提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。(3)用內(nèi)存來模擬外存真正的文件系統(tǒng)對外存進(jìn)行管理,涉及到許多硬件、設(shè)備管理方面的底層技術(shù),一方面這些技術(shù)不屬于操作系統(tǒng)核心內(nèi)容,一方面過多的內(nèi)容不免造成實驗者顧此失彼,所以這里推薦一種使用內(nèi)存來模擬外存的方式,可以跳過這些硬件技術(shù)而直接把精力放在數(shù)據(jù)結(jié)構(gòu)設(shè)計和操作算法設(shè)計上面。假定pInode是一個指向inode結(jié)構(gòu)的指針,而且它已經(jīng)放入的需要放入的數(shù)值了,現(xiàn)在需要將其寫入到特定位置。可用如下代碼:……fd=fopen(“filesystem”,”w+b”);//fd是FILE指針類型,w便是寫方式,b表示二進(jìn)制fseek(fd,specific_area,SEEK_SET);//fd是文件指針;specific_area為整形,//為需要入pInode的位置fwrite(pInode,sizeof(inode),1,fd);//寫入pInode信息2、原理算法本文件系統(tǒng)采用兩級目錄,其中第一級對應(yīng)于用戶賬號,第二級對應(yīng)于用戶帳號下的文件。另外,為了簡便文件系統(tǒng)未考慮文件共享,文件系統(tǒng)安全以及管道文件與設(shè)備文件等特殊內(nèi)容。首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。用戶創(chuàng)建的文件,可以編號存儲于磁盤上。如:file0,file1,file2…并以編號作為物理地址,在目錄中進(jìn)行登記。【設(shè)計思路】1、數(shù)據(jù)結(jié)構(gòu)#defineMAXNAME25/*mfdname,ufdname,filename的最大長度*/#defineMAXCHILD50/*最大的子文件個數(shù)*/#defineMAX(MAXCHILD*MAXCHILD)/*物理地址計數(shù)fpaddrno的最大長度*/typedefstruct/*結(jié)構(gòu)體OSFILE(文件)*/{ intfpaddr;/*文件的物理地址號0,1,2...*/ intflength;/*文件的長度*/ intfmode;/*文件模式:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-protrcted;*/ charfname[MAXNAME];/*文件名*/}OSFILE;typedefstruct/*結(jié)構(gòu)體OSUFD(用戶目錄)*/{ charufdname[MAXNAME];/*ufd的名字*/ OSFILEufdfile[MAXCHILD];/*ufd自己的文件*/}OSUFD;typedefstruct/*結(jié)構(gòu)體OSUFD'LOGIN(用戶注冊)*/{ charufdname[MAXNAME];/*ufd的名字*/ charufdpword[8];/*ufd的密碼*/}OSUFD_LOGIN;typedefstruct/*文件打開模式*/{ intifopen;/*打開情況:0-close,1-open*/ intopenmode;/*讀寫模式0-readonly,1-writeonly,2-readandwrite*/}OSUFD_OPENMODE;OSUFD*ufd[MAXCHILD];/*ufd及ufd自己的文件(指針型)*/OSUFD_LOGINufd_lp;/*建立了一個OSUFD_LOGIN型的ufd_lp*/intucount=0;/*mfd的ufd的個數(shù)*/intfcount[MAXCHILD];/*ufd自己的文件個數(shù)*/intloginsuc=0;/*是否成功登陸,1成功*/charusername[MAXNAME];/*記錄注冊的用戶名*/chardirname[MAXNAME];/*記錄文件當(dāng)前的目錄*/intfpaddrno[MAX];/*記錄文件的物理地址num*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD];/*創(chuàng)建一個OSUFD_OPENMODE型的數(shù)組用于記錄每個文件的打開情況和讀寫模式*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;/*定義FILE*型的文件指針,用于讀文件*/2、主要的函數(shù)說明 voidLoginF()/*用戶注冊登錄*/ voidDirF()/*顯示文件系統(tǒng)的所有文件*/ voidCdF()/*改變路徑*/ voidCreateF()/*創(chuàng)建文件*/ voidDeleteF()/*刪除文件*/ voidModifyFM()/*改變文件模式*/ voidOpenF()/*打開文件*/ voidCloseF()/*關(guān)閉文件*/ voidReadF()/*讀文件*/ voidWriteF()/*寫文件*/ voidQuitF()/*退出文件系統(tǒng)*/voidclrscr()/*清屏*/voidhelp(void)/*幫助*/其他重要輔助函數(shù): char*rtrim(char*str)/*移除最右邊的空格*/ char*ltrim(char*str)/*移除最左邊的空格*/voidSetPANo(intRorW)/*設(shè)置物理地址號(表示該地址號是否被用了0-未用,1-已用),RorW是0-read,1-write*/voidInputPW(char*password)/*輸入密碼并使用'*'代替*/intExistD(char*dirname)/*目錄是否存在,存在返回第i個,不存在返回0*/intExistF(char*filename)/*文件是否存在,返回返回第i個,不存在返回0*/ intFindPANo()/*找出要分配的物理地址號*/intWriteF1()/*創(chuàng)建文件中的寫文件*/3、程序流程設(shè)計:對于自己實現(xiàn)的4個功能:(1)open():進(jìn)入open()進(jìn)入open()當(dāng)前用戶名和當(dāng)前目錄相同?NY請轉(zhuǎn)到當(dāng)前用戶名目錄下當(dāng)前文件存在?(文件號>0)輸入要打開的文件名,并查找對應(yīng)的文件號Y該文件不存在N確定當(dāng)前用戶的用戶號該文件已經(jīng)打開?N該文件已經(jīng)打開,不用再打開Y該文件可以被打開?(不是protect型的)Y該文件是protect的,不能打開打開文件N返回主函數(shù)(2)close():進(jìn)入close()進(jìn)入close()當(dāng)前用戶名和當(dāng)前目錄相同?NY請轉(zhuǎn)到當(dāng)前用戶名目錄下當(dāng)前文件存在?(文件號>0)輸入要關(guān)閉的文件名,并查找對應(yīng)的文件號Y該文件不存在N確定當(dāng)前用戶的用戶號該文件是關(guān)閉的?N該文件未打開,不用關(guān)閉YY關(guān)閉文件返回主函數(shù)(3)write():進(jìn)入write()進(jìn)入write()當(dāng)前用戶名和當(dāng)前目錄相同?NY請轉(zhuǎn)到當(dāng)前用戶名目錄下有打開的文件?輸入要寫入的文件名,并查找對應(yīng)的文件號無已經(jīng)打開的文件提示必須先打開,并顯示出已經(jīng)打開的文件列表NY當(dāng)前文件存在?(文件號>0)該文件不存在NY該文件已經(jīng)打開?該文件未打開,不能寫NY該文件可以被寫入?(是可寫或讀寫模式)該文件是制度模式或保護(hù)模式N確定文件路徑確定文件路徑寫入內(nèi)容到文件中記錄文件長度返回主函數(shù)(4)delete進(jìn)入delete()進(jìn)入delete()當(dāng)前用戶名和當(dāng)前目錄相同?NY請轉(zhuǎn)到當(dāng)前用戶名目錄下當(dāng)前文件存在?(文件號>0)輸入要刪除的文件名,并查找對應(yīng)的文件號Y該文件不存在N確定當(dāng)前用戶的用戶號該文件可以被刪除?(不是protect型的)該文件是protect的,不能打開NY該文件已經(jīng)打開?該文件已經(jīng)打開,不能刪除YN刪除文件確定文件路徑刪除的后面的文件向前移刪除的后面的文件向前移該用戶的文件總數(shù)-1返回主函數(shù)把刪除后的地址號置為未用【源程序清單】Open,close,write、,delete函數(shù)代碼如下:voidOpenF()/*打開文件*/{ charfname[MAXNAME]; inti,k; if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError!Youcanonlyopenfileinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第幾個文件號*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根據(jù)用戶名確定用戶號*/ if(ifopen[k][i].ifopen==1)/*該文件已經(jīng)打開*/ { printf("\nError.file\'%s\'hadbeenopened,itcannotbeopenedagain.\n",fname); } else/*該文件還未打開*/ { if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2))/*該文件的屬性是可以被打開的*/ { ifopen[k][i].ifopen=1;/*打開,將ifopen設(shè)為1*/ ifopen[k][i].openmode=(ufd[k]->ufdfile[i].fmode);/*將ifopen.openmode設(shè)為該文件的模式*/ printf("\'%s\'hasbeenopenedsuccessfully!",fname); } else/*保護(hù)模式的文件不能被打開*/ printf("\n\'%s\'isaprotectedfile,itcannotbeopened.",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidCloseF()/*關(guān)閉文件*/{ charfname[MAXNAME]; inti,k; if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError.Youcanonlymodifyfilemodeinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第幾個文件號*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根據(jù)用戶名確定用戶號*/ if(ifopen[k][i].ifopen==0)/*該文件未打開*/ { printf("\nError.\'%s\'hasbeenclosed.youcannotcloseitagain.\n",fname); } else/*該文件已打開*/ { ifopen[k][i].ifopen=0;/*關(guān)閉,置為0*/ ifopen[k][i].openmode=4;/*修改打開模式為初始的打開模式*/ printf("\'%s\'hasbeenclosedsuccessfully!",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidDeleteF()/*刪除文件*/{ charfname[MAXNAME]; inti,k,x; charstr[255],str1[255]; if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError.Youcanonlydeletefileinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第幾個文件號*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根據(jù)用戶名確定用戶號*/ if(ufd[k]->ufdfile[i].fmode==3)/*該文件的屬性是protect的*/ { printf("\n\'%s\'isaprotectedfile,itcannotbedeleted.",fname); } else/*該文件的屬性不是protect的可以刪除*/ { if(ifopen[k][i].ifopen==1)/*該文件已打開不能刪*/ printf("\n\'%s\'hasbeenopened,itcannotbedeleted.",fname); else/*關(guān)閉的可以刪*/ { itoa(ufd[k]->ufdfile[i].fpaddr,str,10);/*itoa是將整型轉(zhuǎn)換為字符串,存入str中,10代表10進(jìn)制*/ strcpy(str1,"file"); strcat(str1,str);/*str連到str1后*/ strcpy(str,"c:\\osfile\\file\\");/*文件目錄拷到str中*/ strcat(str,str1);/*把str1連入,最后str為c:\\osfile\\file\\filex*/ x=_unlink(str);/*刪除路徑為str的文件,刪除成功返回0,否則返回-1*/ fpaddrno[ufd[k]->ufdfile[i].fpaddr]=0;/*把刪除后的地址號置為未用*/ for(i;i<(fcount[k]-1);i++) { ufd[k]->ufdfile[i]=ufd[k]->ufdfile[i+1];/*刪除的文件后面的文件向前移*/ } fcount[k]--;/*刪除后第k個用戶的文件數(shù)減1*/ printf("\'%s\'hasbeendeletedsuccessfully!",fname); } } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidWriteF()/*寫文件*/{ charstr[50],str1[50]; inti,k,n=0; charfname[MAXNAME]; char*rtrim(char*str); char*ltrim(char*str);/*移除空格*/ intExistF(char*filename);/*文件名是否存在返回文件號,Exist-i,NotExist-0*/ intExistD(char*dirname); if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*如果當(dāng)前目錄為空(主目錄)*/ { printf("\nError.Pleaseconverttoufddirbeforewrite.\n");/*必須轉(zhuǎn)到用戶目錄下*/ return; } else { printf("\nCaution:Openfilefirst\n"); printf("OpenedFile(s)List:\n"); k=ExistD(dirname);/*第幾個用戶*/ for(i=0;i<fcount[k];i++)/*第k個用戶有多少個文件*/ { if(ifopen[k][i].ifopen==1)/*如果文件已打開*/ if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))/*可以讀*/ { printf("%15s",ufd[k]->ufdfile[i].fname);/*輸出這個已打開的可讀的文件名*/ n++; } if((n%4==0)&&(n!=0)) printf("\n");/*4個換行*/ } printf("\n%dfilesopenned.\n",n); if(n==0)/*無打開的文件,返回*/ return; if(n!=0)/*有打開的文件*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*移除空格*/ i=ExistF(fname);/*第幾個文件號*/ if(i>=0)/*文件存在*/ { if(ifopen[k][i].ifopen==1)/*已打開*/ { if((ifopen[k][i].openmode==1)||(ifopen[k][i].openmode==2))/*屬性可以寫*/ { itoa(ufd[k]->ufdfile[i].fpaddr,str,10);/*將文件號整形轉(zhuǎn)為字符串*/ strcpy(str1,"file"); strcat(str1,str); strcpy(str,"c:\\osfile\\file\\"); strcat(str,str1);/*str形成路徑c:\\osfile\\file\\filex*/ fp_file=fopen(str,"wb+");/*以寫二進(jìn)制方式(并且先清除已有的內(nèi)容)打開filex文件*/ intlength=0; charc; 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保設(shè)備制造與技術(shù)許可合同
- 2024年虛擬現(xiàn)實內(nèi)容制作與授權(quán)合同
- 運(yùn)輸租賃合同
- 2024年跨境電商平臺貨物運(yùn)輸合同
- 2024年版城市供水設(shè)施改造合同協(xié)議
- 二零二五年度城市道路照明電氣安裝規(guī)范及運(yùn)維服務(wù)合同3篇
- 2025年度電子商務(wù)平臺合作合伙協(xié)議合同3篇
- 兒童托管服務(wù)家長監(jiān)護(hù)責(zé)任免責(zé)協(xié)議
- 2025板材電商平臺合作與運(yùn)營管理合同3篇
- 核電站運(yùn)營合同
- 《中國近現(xiàn)代史綱要(2023版)》課后習(xí)題答案合集匯編
- 家庭管理量表(FaMM)
- 腰椎間盤突出癥的射頻治療
- 2023屆河南省洛陽市平頂山市許昌市濟(jì)源市高三一模語文試題
- 【超星爾雅學(xué)習(xí)通】《老子》《論語》今讀網(wǎng)課章節(jié)答案
- 配電箱采購技術(shù)要求
- 上海外國語大學(xué)附屬外國語學(xué)校2020-2021七年級下學(xué)期期中英語試卷+答案
- 綠色施工措施措施 四節(jié)一環(huán)保
- TCSES 71-2022 二氧化碳地質(zhì)利用與封存項目泄漏風(fēng)險評價規(guī)范
- GB/T 8561-2001專業(yè)技術(shù)職務(wù)代碼
- GB/T 7661-2009光學(xué)零件氣泡度
評論
0/150
提交評論