操作系統(tǒng)模擬unix文件系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁
操作系統(tǒng)模擬unix文件系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁
操作系統(tǒng)模擬unix文件系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁
操作系統(tǒng)模擬unix文件系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁
操作系統(tǒng)模擬unix文件系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)大型實(shí)驗(yàn)班級: 學(xué)號: 姓名:一 實(shí)驗(yàn)介紹 1.實(shí)驗(yàn)名稱 2.實(shí)驗(yàn)?zāi)康?3.實(shí)驗(yàn)內(nèi)容及要求二 實(shí)驗(yàn)環(huán)境三 實(shí)驗(yàn)設(shè)計(jì) 1.數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 2.系統(tǒng)流程設(shè)計(jì) 3.實(shí)現(xiàn)命令操作四 模塊詳解 1 .文件操作 2 .用戶操作五 實(shí)驗(yàn)演示 1 .初始化磁盤塊 2 .用戶登錄 3 .目錄操作 4 .文件操作六 源代碼七 實(shí)驗(yàn)心得體會 1.調(diào)試中遇到的問題總結(jié) 2.實(shí)驗(yàn)感悟一、實(shí)驗(yàn)介紹1.實(shí)驗(yàn)名稱操作系統(tǒng)大型實(shí)驗(yàn) 2.實(shí)驗(yàn)?zāi)康耐瓿梢粋€(gè) UNIX/Linux文件系統(tǒng)的子集的模擬實(shí)現(xiàn),了解Unix文件系統(tǒng)的實(shí)現(xiàn)機(jī)制。 3.實(shí)驗(yàn)內(nèi)容及要求(1) 文件卷結(jié)構(gòu)設(shè)計(jì)0#塊可省略I節(jié)點(diǎn)棧及空間為20項(xiàng)塊大小為512字

2、節(jié)卷盤塊數(shù)大于100I節(jié)點(diǎn)盤塊數(shù)大于10塊(2) I節(jié)點(diǎn)結(jié)構(gòu)設(shè)計(jì)文件大小文件聯(lián)接計(jì)數(shù)文件地址文件擁有者文件所屬組文件權(quán)限及類別文件最后修改時(shí)間其中文件地址為六項(xiàng):四個(gè)直接塊號,一個(gè)一次間址,一個(gè)兩次間址(3) 目錄結(jié)構(gòu)用16字節(jié)表示,其中14字節(jié)為文件名,2字節(jié)為I節(jié)點(diǎn)號(4) 用戶及組結(jié)構(gòu)用戶信息中包括用戶名、口令,所屬組,用戶打開文件表(5) 文件樹結(jié)構(gòu)除(4)要求外,適當(dāng)考慮UNIX本身文件樹結(jié)構(gòu)(6) 實(shí)現(xiàn)功能Ls 顯示文件目錄Chmod 改變文件權(quán)限Chown改變文件擁有者Chgrp改變文件所屬組Pwd 顯示當(dāng)前目錄Cd 改變當(dāng)前目錄Mkdir創(chuàng)建子目錄Rmdir刪除子目錄Mv 改變

3、文件名Cp 文件拷貝Rm 文件刪除Ln 建立文件聯(lián)接Cat 連接顯示文件內(nèi)容Vi 文件寫入Mk 創(chuàng)建文件umask 查看用戶屏蔽碼Umask文件創(chuàng)建屏蔽碼Passwd 修改用戶口令Ls-l 查看文件類型Login 用戶注銷 Logout 退出系統(tǒng) Help 顯示幫助信息二、實(shí)驗(yàn)環(huán)境實(shí)驗(yàn)設(shè)備:Microsoft Visual Studio 2010 開發(fā)語言:c+三、實(shí)驗(yàn)設(shè)計(jì)1.數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)磁盤文件結(jié)構(gòu)設(shè)計(jì):用一個(gè)名為disk.txt的文件模擬Unix系統(tǒng)磁盤 ,總共分為200塊,每塊514個(gè)字節(jié)(實(shí)際可用512個(gè)字節(jié),還有2個(gè)字節(jié)是磁盤分割符n),使第一塊(0#)盤塊做為超級塊,記錄該系統(tǒng)磁盤

4、的使用情況;第二塊(1#)盤塊第十三塊(12#)盤塊作為存儲I結(jié)點(diǎn)使用,每個(gè)I結(jié)點(diǎn)74個(gè)字節(jié),所以每個(gè)盤塊可以存放6個(gè)I結(jié)點(diǎn),總共有72個(gè)I結(jié)點(diǎn),記錄在超級塊中;十三塊(12#)以后的盤塊作為存儲文件內(nèi)容使用,總共187個(gè)盤塊,用成組連接法記錄在超級塊中。對于I結(jié)點(diǎn)的具體設(shè)計(jì)如下:class INode /(74B)public:int fsize;/文件大小 setw(6) int fbnum;/文件盤塊數(shù) setw(6) int addr4;/四個(gè)直接盤塊號 文件最大為4*512=2048=2KB setw(4)*4 int addr1;/一個(gè)一次間址() 文件大于2KB,小于2KB+16

5、*512=10KB setw(4) int addr2;/一個(gè)兩次間址()文件大于10KB,小于10KB+16*16*512B=138KB setw(4) char owner6;/文件擁有者 setw(6) char group6;/文件所屬組 setw(6) char mode12;/ 文件類別及存儲權(quán)限 setw(12) char ctime10;/最近修改時(shí)間 setw(10) int connect;/文件聯(lián)接計(jì)數(shù);對于超級塊的具體設(shè)計(jì)如下:class superBlockpublic:int FIStack72;/空閑結(jié)點(diǎn)號棧 setw(3)*72 int FICount;/空閑i

6、結(jié)點(diǎn)總數(shù) setw(3) int FIPtr;/空閑結(jié)點(diǎn)棧指針 setw(3) int FBStack10;/空閑盤塊號棧 setw(4)*10 int FBCount;/空閑盤塊總數(shù) setw(4) int FBPtr;/空閑盤塊棧指針 setw(3) ;初始化磁盤示意圖:14#13#120#塊。1#塊12#塊13#塊14#塊16#塊15#塊。空閑節(jié)點(diǎn)號??臻e盤塊號??臻e節(jié)點(diǎn)總數(shù)71空閑節(jié)點(diǎn)指針1空閑盤塊總數(shù)186空閑節(jié)點(diǎn)指針172。22#。22#。1272用于文件具體內(nèi)容存放除了超級塊、I結(jié)點(diǎn)、磁盤文件的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)以外,為了系統(tǒng)操作方便,我還設(shè)計(jì)了用戶類、文件目錄類。用戶類具體設(shè)計(jì):cl

7、ass USER/用戶(24B)public:char name6;/用戶名 setw(6) char pass6;/密碼 setw(6) char group6;/所屬組 setw(6) int umask3;/用戶umask碼 setw(6) ;用戶信息全部存放在一個(gè)user.txt的文件里面,所以對于user.txt文件也有一個(gè)設(shè)計(jì),文件最開始是存放用戶總數(shù)(setw(6)),隨后跟著的是每一位用戶名、密碼、所屬組、用戶umask碼。文件目錄類具體設(shè)計(jì):class Catalog/目錄項(xiàng)(18B)public:char fname14;/文件名 setw(14) int index; /

8、i結(jié)點(diǎn)號 setw(4) ;目錄信息全部都存放在disk磁盤里面,所以具體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)都在上面的磁盤文件設(shè)計(jì)中提及。 2. 程序流程設(shè)計(jì) 系統(tǒng)主體流程圖設(shè)計(jì)見圖1 用戶注冊流程圖見圖2登陸功能流程圖見圖3用戶修改口令流程圖見圖4用戶umask碼修改流程圖見圖5 顯示所有子目錄ls操作流程圖見圖6創(chuàng)建文件mk、目錄mkdir流程圖見圖7刪除文件rm流程圖見圖8刪除目錄文件rmdir流程圖見圖9 改變當(dāng)前路徑cd操作流程圖見圖10查看文件內(nèi)容cat操作流程圖見圖11 拷貝文件、目錄cp操作流程圖見圖12建立文件聯(lián)接ln操作流程圖見圖13修改文件名稱MV操作流程圖見圖14 修改文件權(quán)限chmod操作

9、流程圖見圖15修改文件擁有者chown、所屬組chgrp操作流程圖見圖16寫流程圖vi見圖17開始N文件系統(tǒng)初始化分析命令修改用戶口令顯示目錄系統(tǒng)退出改變文件擁有者改變文件所屬組顯示當(dāng)前目錄改變當(dāng)前目錄創(chuàng)建子目錄刪除子目錄改變文件名文件拷貝文件刪除改變文件權(quán)限Y用戶注銷文件系統(tǒng)初始化?是否為新用戶?Y注冊并登陸直接登陸N讀入超級塊中信息顯示文件內(nèi)容建立文件聯(lián)接文件寫入創(chuàng)建文件查看用戶屏蔽碼文件創(chuàng)建屏蔽碼查看文件類型幫助信息顯示結(jié)束圖1系統(tǒng)主體流程圖輸入命令圖2 注冊功能流程圖開始返回輸入用戶名是否被使用?YN再次輸入口令輸入口令兩次輸入是否匹配?YN用戶名密碼寫入文件圖3 登陸功能流程圖開始返

10、回輸入用戶名密碼用戶名密碼是否都匹配?YN登陸成功圖4 用戶修改口令流程圖開始返回輸入原始密碼密碼是否輸入正確?YN新密碼寫入文件輸入新密碼兩次兩次輸入是否匹配?YN圖5 用戶umask碼修改流程圖開始返回是否找到?輸入新的用戶umask碼用戶文件中查找該用戶YN新的umask碼寫入文件開始返回當(dāng)前文件是否為空?YN遍歷當(dāng)前目錄中文件項(xiàng)讀入判斷文件是否為目錄文件?N當(dāng)前目錄為空遞歸讀入該目錄內(nèi)容Y輸出所有剛剛讀入的文件項(xiàng)圖6 顯示所有子目錄ls操作流程圖圖7 創(chuàng)建文件mk、目錄mkdir流程圖開始返回輸入文件名文件中是否有重名?NY申請I結(jié)點(diǎn)和盤塊是否都申請成功?N文件創(chuàng)建失敗Y當(dāng)前目錄文件i

11、結(jié)點(diǎn)修改新建文件名、結(jié)點(diǎn)寫入當(dāng)前目錄新建文件i結(jié)點(diǎn)初始化新建文件成功圖8 刪除文件rm流程圖開始輸入文件名返回對當(dāng)前目錄是否有操作權(quán)限?文件刪除失敗對當(dāng)前文件夾是否存在該文件?對該文件是否有操作權(quán)限?該文件是否為數(shù)據(jù)文件?該文件是否為聯(lián)接文件?回收文件的盤塊、結(jié)點(diǎn)當(dāng)前目錄中刪除該文件名當(dāng)前目錄中i結(jié)點(diǎn)的修改文件刪除成功NNNNNYYYYY圖9 刪除目錄文件rmdir流程圖開始輸入文件名返回對當(dāng)前目錄是否有操作權(quán)限?目錄刪除失敗對當(dāng)前目錄是否存在該子目錄?對該子目錄是否有操作權(quán)限?該文件是否為目錄文件?該目錄文件是否為空?回收目錄的盤塊、結(jié)點(diǎn)當(dāng)前目錄中刪除該目錄名當(dāng)前目錄中i結(jié)點(diǎn)的修改目錄刪除成

12、功遞歸刪除YYYYYNNNNN圖10 改變當(dāng)前路徑cd操作流程圖開始輸入修改路徑分析路徑路徑為'.路徑為'.路徑為'/路徑為子目錄名路徑為絕對路徑切換到當(dāng)前目錄切換到根目錄切換到父目錄切換到指定的子目錄切換到指定的任意目錄返回圖11 查看文件內(nèi)容cat操作流程圖開始輸入文件名該文件是否為數(shù)據(jù)文件?NY讀取文件內(nèi)容當(dāng)前目錄下是否存在該文件?YN讀取文件失敗返回圖12 拷貝文件、目錄cp操作流程圖開始輸入需要拷貝的文件名,拷貝的指定路徑返回對當(dāng)前目錄是否存在該文件?分析文件類型要拷貝文件為目錄文件要拷貝文件為數(shù)據(jù)文件保存當(dāng)前路徑保存當(dāng)前路徑指定路徑下新建目錄文件指定路徑下新

13、建數(shù)據(jù)文件讀入目錄文件內(nèi)容讀入數(shù)據(jù)文件內(nèi)容讀入的內(nèi)容寫入新建目錄文件讀入的內(nèi)容寫入新建數(shù)據(jù)文件路徑還原圖13 建立文件聯(lián)接ln操作流程圖開始輸入建立聯(lián)接的兩個(gè)文件名Y對該文件是否有操作權(quán)限?Y對當(dāng)前目錄是否存在建立聯(lián)接的文件?Y對當(dāng)前目錄是否有操作權(quán)限?NNN新建一個(gè)文件名不同,結(jié)點(diǎn)號相同的文件返回建立聯(lián)接文件不成功圖14 修改文件名稱MV操作流程圖開始輸入要修改的文件名Y對該文件是否有操作權(quán)限?Y對當(dāng)前目錄是否存在修改的文件?Y對當(dāng)前目錄是否有操作權(quán)限?NNN將新的文件名替換舊的寫入文件返回修改文件名不成功輸入修改以后的文件名Y該目錄中是否有同名的文件?N修改當(dāng)前文件i結(jié)點(diǎn)NNN對當(dāng)前目錄是

14、否有操作權(quán)限?Y對當(dāng)前目錄是否存在修改的文件?Y對該文件是否有操作權(quán)限?Y輸入要修改的文件名開始圖15 修改文件權(quán)限chmod操作流程圖分析當(dāng)前用戶文件擁有這文件所屬組內(nèi)成員其他用戶選擇修改哪類用戶的權(quán)限選擇修改模式返回修改權(quán)限失敗YNNN對當(dāng)前目錄是否有操作權(quán)限?Y對當(dāng)前目錄是否存在修改的文件?Y輸入要修改的文件名圖16 修改文件擁有者chown、所屬組chgrp操作流程圖開始輸入修改以后的文件所有者/所屬組對該文件是否有操作權(quán)限?NY修改當(dāng)前目錄i結(jié)點(diǎn)和子目錄i結(jié)點(diǎn)該所有者的用戶名/所屬組是否合法?修改的文件是否為目錄文件?YN遞歸修改其子文件的擁有者/所屬組修改當(dāng)前目錄i結(jié)點(diǎn)和子目錄i結(jié)

15、點(diǎn)返回YYYYNNN該文件是否為數(shù)據(jù)文件?對該文件是否有操作權(quán)限?當(dāng)前目錄是否存在該文件? 圖17 寫文件vi操作流程圖開始開始當(dāng)前目錄有權(quán)限否?輸入文件名N寫入文件不成功選擇自己輸入還是系統(tǒng)填充手動輸入內(nèi)容選擇系統(tǒng)填充的字符個(gè)數(shù)根據(jù)內(nèi)容分配盤塊內(nèi)容寫入結(jié)束3.實(shí)現(xiàn)命令操作cdenter .enter 切換到當(dāng)前目錄cdenter /enter 切換到根目錄cdenter .enter 切換到父目錄cdenter direnter 切換到某一子目錄,dir為子目錄名cdenter stringenter 切換到指定路徑的目錄,string為路徑mkdirenter direnter 當(dāng)前目錄下

16、創(chuàng)建名為dir的子目錄rmdirenter direnter 刪除當(dāng)前目錄下名為dir的子目錄mkenter fileenter 當(dāng)前目錄下創(chuàng)建名為file的文件rmenter fileenter 刪除當(dāng)前目錄下名為file的文件cpenter dirORfileenter stringenter 拷貝當(dāng)前目錄下文件或子目錄到指定路徑下 catenter fileenter 查看當(dāng)前目錄下名為file的文件內(nèi)容vienter fileenter 向當(dāng)前目錄下名為file的文件寫入一定內(nèi)容pwdenter 顯示當(dāng)前目錄lsenter 顯示所有子目錄chmodenter fileenter 改變當(dāng)

17、前目錄下名為file文件的權(quán)限chownenter fileenter 改變當(dāng)前目錄下名為file文件的擁有者chgrpenter fileenter 改變當(dāng)前目錄下名為file文件的所屬組MVenter fileenter 改變當(dāng)前目錄下名為file文件的文件名loginenter 用戶注銷,可以重新登陸passwdenter 用戶改變密碼umaskenter 查看用戶umask碼Umaskenter codeenter 修改用戶umask碼為codelnenter file1enter file2enter文件file1與file2建立連結(jié)ls-lenter fileenter 查看文件f

18、ile的類別helpenter 提供幫助logoutenter 退出系統(tǒng)四、模塊詳解1.文件操作mk創(chuàng)建文件模塊,輸入mk命令,回車,輸入文件名,回車,即會在當(dāng)前目錄文件下創(chuàng)建一個(gè)名為剛剛輸入的文件名的數(shù)據(jù)文件。在該創(chuàng)建過程中首先要判斷該目錄中有沒有同名的文件,如果有的話就創(chuàng)建失敗,還要判斷在該目錄下有沒有創(chuàng)建文件的權(quán)限,有權(quán)限才可以創(chuàng)建。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。rm刪除文件模塊,輸入rm命令,回車,輸入文件名,回車,即會在當(dāng)前目錄文件下刪除一個(gè)名為剛剛輸入的文件名的數(shù)據(jù)文件。在該刪除過程中要判斷該目錄中是否存在該文件,如果不存在就沒有必要執(zhí)行該操作了,還要判斷在該目錄下有沒

19、有刪除文件的權(quán)限,有權(quán)限才可以刪除。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。mkdir創(chuàng)建目錄文件模塊,輸入mkdir命令,回車,輸入文件名,回車,即會在當(dāng)前目錄文件下創(chuàng)建一個(gè)名為剛剛輸入的文件名的目錄文件。在該創(chuàng)建過程中首先要判斷該目錄中有沒有同名的文件,如果有的話就創(chuàng)建失敗,還要判斷在該目錄下有沒有創(chuàng)建文件的權(quán)限,有權(quán)限才可以創(chuàng)建。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。rmdir刪除目錄文件模塊,輸入rmdir命令,回車,輸入文件名,回車,即會在當(dāng)前目錄文件下刪除一個(gè)名為剛剛輸入的文件名的目錄文件。在該刪除過程中要判斷該目錄中是否存在該目錄文件,如果不存在就沒有必要執(zhí)行該操作了,還要

20、判斷在該目錄下有沒有刪除文件的權(quán)限,有權(quán)限才可以刪除。刪除的時(shí)候要判斷該目錄是否為空,如果里面有內(nèi)容,則要通過遞歸函數(shù),將他們一并刪除了。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。cp拷貝文件模塊,輸入cp命令,回車,輸入要拷貝文件的文件名,回車,輸入要拷貝到哪個(gè)路徑下面,即會在該路徑下創(chuàng)建一個(gè)名為與被拷貝文件名相同的數(shù)據(jù)文件(目錄文件),并且指向盤塊里面的內(nèi)容都相同的數(shù)據(jù)文件(目錄文件)。在該拷貝過程中要判斷該目錄中是否存在該文件,如果不存在就沒有必要執(zhí)行該操作了,還要判斷在該目錄下有沒有拷貝文件的權(quán)限,有權(quán)限才可以拷貝。然后要查看該路徑是否存在,存在該路徑才可以在該路徑下創(chuàng)建拷貝過來的文件

21、,具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。cat顯示文件內(nèi)容模塊,輸入cat命令,回車,輸入文件名,回車,即會在屏幕上顯示該文件的具體內(nèi)容。在該過程中要判斷該目錄中是否存在該文件,如果不存在就沒有必要執(zhí)行該操作了。執(zhí)行操作時(shí),要調(diào)用readfile(INode inode)函數(shù),先讀入文件內(nèi)容到content里面,然后直接輸出。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。ls顯示當(dāng)前目錄下所有目錄的模塊,輸入ls命令,回車,即會在屏幕上顯示當(dāng)前目錄下的所有目錄。在該過程中要判斷該目錄中是否為空,如果為空就沒有必要執(zhí)行該操作了。執(zhí)行操作時(shí),要調(diào)用readdir(INode inode)函數(shù),先讀

22、入文件內(nèi)容到content里面,然后直接輸出。如果子目錄里面還有子目錄,則通過遞歸,一并輸出來。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。pwd顯示當(dāng)前目錄的模塊,輸入pwd命令,回車,即會在屏幕上顯示當(dāng)前所在的目錄。vi寫文件操作模塊,輸入vi命令,回車,輸入文件名,回車,既可以選擇自己輸入內(nèi)容還是系統(tǒng)自動輸入,選擇自己輸入的話,可以自己主動隨便輸入什么內(nèi)容然后回車。如果選擇系統(tǒng)自動輸入,那么還需要輸入要填充的字符個(gè)數(shù),系統(tǒng)就會自動填充。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。chmod改變文件權(quán)限模塊,輸入chmod命令,回車,輸入文件名,回車,即會根據(jù)不同類別的用戶在屏幕上提示要改變哪

23、一類用戶的權(quán)限。如果是文件擁有者執(zhí)行該操作,他可以選擇修改自己、其他用戶的權(quán)限;如果是文件所屬組成員執(zhí)行該操作,他可以選擇修改自己、其他用戶的權(quán)限;如果是其他用戶執(zhí)行該操作,他只能選擇修改自己的權(quán)限;在該過程中要判斷該目錄中是否存在該文件,如果不存在就沒有必要執(zhí)行該操作了。執(zhí)行操作時(shí),要判斷對該文件有沒有執(zhí)行寫操作的權(quán)利,沒有就不能進(jìn)行。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。chown改變文件所有者模塊,輸入chown命令,回車,輸入文件名,回車,就會判斷執(zhí)行者對于該文件有沒有改變的權(quán)限,沒有的話就不能執(zhí)行,還有判斷當(dāng)前目錄下有沒有該文件,沒有的話就沒有必要執(zhí)行該操作。判斷可以執(zhí)行時(shí),就會

24、提示輸入改變以后的所有者,然后判斷輸入的用戶名的合法性,判斷合法則修改成功。(如果修改的文件時(shí)目錄文件,則將它下面的文件全部一起改了)具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。chgrp改變文件所屬組模塊,輸入chgrp命令,回車,輸入文件名,回車,就會判斷執(zhí)行者對于該文件有沒有改變的權(quán)限,沒有的話就不能執(zhí)行,還有判斷當(dāng)前目錄下有沒有該文件,沒有的話就沒有必要執(zhí)行該操作。判斷可以執(zhí)行時(shí),就會提示輸入改變以后的所屬組,然后判斷輸入的組名的合法性,判斷合法則修改成功。(如果修改的文件時(shí)目錄文件,則將它下面的文件全部一起改了)具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。MV改變文件名模塊,輸入MV命令

25、,回車,輸入文件名,回車,就會判斷執(zhí)行者對于該文件有沒有改變的權(quán)限,沒有的話就不能執(zhí)行,還有判斷當(dāng)前目錄下有沒有該文件,沒有的話就沒有必要執(zhí)行該操作。判斷可以執(zhí)行時(shí),就會提示輸入改變以后的文件名,然后判斷輸入文件名是否與當(dāng)前目錄下有重名的,判斷沒有重名則修改成功。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。ln建立文件聯(lián)接模塊,輸入ln命令,回車,輸入要建立聯(lián)接文件的文件名,回車,輸入要連接到哪個(gè)文件的文件名,即會在該路徑下創(chuàng)建一個(gè)以此命名的數(shù)據(jù)文件,并且該文件名后面的I結(jié)點(diǎn)號與前面一個(gè)文件的I結(jié)點(diǎn)號相同,指向相同的盤塊。在該過程中要判斷該目錄中是否存在該文件,如果不存在就沒有必要執(zhí)行該操作了,

26、還要判斷在該目錄下有沒有拷貝文件的權(quán)限,有權(quán)限才可以拷貝。然后要查看該文件的重名是否存在,存在則建立聯(lián)接失敗,具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。ls-l顯示文件類型模塊,輸入MV命令,回車,輸入文件名,回車,則會在屏幕上輸出該文件的類型是目錄文件還是數(shù)據(jù)文件。cd改變當(dāng)前所在目錄的模塊。輸入cd,回車,相應(yīng)的字符串,回車,則會根據(jù)輸入字符串的不同跳轉(zhuǎn)到不同的目錄下。如果字符串是.,則到當(dāng)前目錄;如果字符串是.,則到父目錄;如果字符串是/,則到根目錄;如果字符串是當(dāng)前目錄下的子目錄,則到該子目錄;如果字符串是一個(gè)決定路徑,則到該絕對路徑。當(dāng)然在執(zhí)行的時(shí)候要判斷有沒有該子目錄或者該絕對路徑

27、,如果沒有的話,就不能執(zhí)行。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。 2. 用戶操作login用戶注銷模塊,輸入login,回車,當(dāng)前用戶就退出了,需要重新登錄。passwd用戶修改口令模塊,輸入passwd,回車,則會提示輸入原始密碼,輸入正確了才可以提示輸入新密碼,并且要求新密碼輸入兩次,兩次一樣了才能通過修改密碼成功。具體流程圖查看第二節(jié),系統(tǒng)流程圖設(shè)計(jì)部分。umask用戶查看umask碼模塊,輸入umask,回車,屏幕上就會顯示當(dāng)前用戶的用戶umask碼。Umask用戶修改umask碼模塊,輸入U(xiǎn)mask,回車,輸入新的umask碼,回車,既可以更新原有的用戶屏蔽碼。logout用戶

28、退出系統(tǒng)模塊,輸入logout,回車,系統(tǒng)自動退出。help用戶尋求幫助模塊,當(dāng)用戶不清楚執(zhí)行命令的時(shí)候,可以輸入help,回車,屏幕上會顯示出各種命令語句。五、實(shí)驗(yàn)演示 1 .初始化磁盤塊超級塊與I結(jié)點(diǎn)初始化結(jié)果截圖:成組連接法每10個(gè)盤塊一組,最后一組只有7個(gè),空閑盤塊截圖:2 .用戶登錄直接登錄:注冊登錄:注冊以后用戶文件里面已經(jīng)有新用戶的記錄: 3 .目錄操作新建目錄:新建以后可以看到盤塊中已存在這兩個(gè)目錄:這兩個(gè)目錄的i結(jié)點(diǎn)分配情況:刪除目錄:刪除操作以后目錄中aa目錄項(xiàng)已經(jīng)被刪除:刪除操作以后aa文件的i結(jié)點(diǎn)結(jié)點(diǎn)也被回收:改變當(dāng)前路徑:復(fù)制目錄文件:此時(shí)bb目錄以及它下面的目錄cc

29、,一并拷貝到aa目錄下面了:顯示當(dāng)前目錄:顯示當(dāng)前目錄下的所有文件目錄:改變目錄名:改變目錄名以后可以看到磁盤中aa已經(jīng)變成了bc:改變目錄權(quán)限:改變目錄擁有者:改變目錄所屬組:查看文件類別: 4 .文件操作 新建文件新建文件以后磁盤中已經(jīng)有這兩個(gè)文件:刪除文件執(zhí)行刪除操作以后磁盤中文件已經(jīng)刪除:寫文件拷貝文件查看文件建立文件聯(lián)接 可以看到此時(shí)存在一個(gè)ce文件與aa雖然文件名不同,但是指向的是同一個(gè)I結(jié)點(diǎn),相當(dāng)于一個(gè)文件有兩個(gè)名稱。修改文件權(quán)限、文件擁有者、文件所屬組與前面的目錄操作是相同的,這里不再重復(fù)演示。六、重要函數(shù)及其實(shí)現(xiàn)方法 bool havesame(char *dirname,I

30、Node inode,int &i,int &index2)函數(shù)主要用于判斷文件在當(dāng)前路徑下是否存在,輸入文件名,當(dāng)前路徑目錄文件的節(jié)點(diǎn)號inode,就可以通過inode節(jié)點(diǎn)中的addr定位到該目錄文件,然后通過一個(gè)個(gè)查找,與dirname對比,找到相等的,就說明該目錄文件中有該文件,可以對它進(jìn)行操作。該函數(shù)在整個(gè)程序的功能實(shí)現(xiàn)中都會用到,因?yàn)槊窟M(jìn)行一個(gè)文件操作,首先要判斷它是否存在,只有存在該文件才可以對它進(jìn)行一定的操作。 bool find(char *string)函數(shù)同樣是貫穿于整個(gè)程序,它的主要功能是找到string指明的路徑,并且轉(zhuǎn)換當(dāng)前路徑到該路徑下,查找的過程主

31、要是按照路徑一個(gè)目錄一個(gè)目錄往下查找,每查找一個(gè)目錄都是通過調(diào)用havesame函數(shù)實(shí)現(xiàn)的。該函數(shù)在很多功能中都會用到,比如說將一個(gè)指定文件拷貝到指定路徑下,就要通過該函數(shù)先確定該路徑是否存在,并且轉(zhuǎn)換到該路徑下。 int balloc()函數(shù)用于申請新盤塊,因?yàn)榇疟P所有盤塊都是通過成組鏈接法管理的,在該函數(shù)中每申請一個(gè)盤塊的時(shí)候都會檢查有沒有到棧底,如果是棧底了,就必須先把棧底盤塊里面存放的下一組盤塊號調(diào)入棧中,然后把該盤塊分配出去。 void bfree(int index)函數(shù)與申請盤塊的函數(shù)相對應(yīng),它是用于指定盤塊的回收的,同樣的,為了實(shí)現(xiàn)成組鏈接法,當(dāng)一個(gè)盤塊回收時(shí),必須先檢查盤塊號

32、棧是否已滿,如果已滿,則先把棧里面的盤塊號全部都寫入要回收的盤塊中,然后清空棧,把剛剛回收的盤塊號寫入棧底。 void rmdir(char *dirname,int index)該函數(shù)主要用于刪除指定目錄,刪除目錄時(shí)主要考慮的問題是該目錄下面的子目錄是不是也要刪除了?要怎樣實(shí)現(xiàn)?所以該函數(shù)中我要運(yùn)用了遞歸的方法,刪除該目錄的時(shí)候先檢查他下面是否有子目錄,然后對每一個(gè)子目錄執(zhí)行該函數(shù),如此循環(huán),直到它為空目錄了才將目錄刪除。同樣的在修改目錄擁有者函數(shù)void chown(char *name),目錄所屬組函數(shù)void chgrp(char *name) 中我也運(yùn)用了同樣的方法來實(shí)現(xiàn)該目錄下面子

33、目錄文件,目錄的擁有者、所屬組修改。 void writefile(INode inode,int in)該函數(shù)為文件寫函數(shù),該函數(shù)的實(shí)現(xiàn)也是比較復(fù)雜的,首先要調(diào)用讀文件的函數(shù)void readfile(INode inode)讀入該文件原先的內(nèi)容,將原先的內(nèi)容與新寫入的內(nèi)容進(jìn)行比較,如果原先內(nèi)容多,那么先將多余的盤塊回收了,然后將內(nèi)容寫入。如果新寫入的內(nèi)容多,那么說明盤塊不夠,需要申請盤塊,在申請盤塊的過程中每申請一個(gè)盤塊之前都要先判斷原先內(nèi)容有沒有寫到這一塊,如果沒有則進(jìn)行申請,否則不用申請。盤塊申請完以后就可以將內(nèi)容寫入了。其他比較簡單的功能實(shí)現(xiàn)函數(shù)由于代碼比較多,而且具體功能在模塊詳解

34、以及系統(tǒng)流程設(shè)計(jì)的流程圖中都有很詳細(xì)的說明,這里就不再解釋了,而且附上的源代碼文件里面都已經(jīng)寫了很詳細(xì)的注釋,這里就不占篇幅了。七、實(shí)驗(yàn)心得體會 1.調(diào)試中遇到的問題總結(jié)本次實(shí)驗(yàn)中主要遇到的問題及解決方案:寫入文件的時(shí)候因?yàn)榉峙浔P塊用的是成組連接法,當(dāng)讀到一組里面最后一個(gè)盤塊的時(shí)候需要從該盤塊中讀入下一組盤塊號進(jìn)入棧,每次運(yùn)行到分配盤塊的時(shí)候總是出錯,分配前面幾組都是正確的,但是到某一組就是讀不進(jìn)來下一組的盤塊號,當(dāng)時(shí)是設(shè)了斷點(diǎn)一步步調(diào)試,還用寫入的方法測試了下位置對不對,結(jié)果寫入的位置是正確的,然后就郁悶了,不知道怎么回事,后來發(fā)現(xiàn)了一到讀三位數(shù)的就不正確了,因?yàn)樵诒P塊里面我初始化的時(shí)候,寫

35、入的都是每個(gè)盤塊號只占了三個(gè)字節(jié),所以三位數(shù)都是黏在一起的,中間沒有空格,在讀入的時(shí)候就不會讀入一個(gè)個(gè)數(shù),而是一長串?dāng)?shù)字,導(dǎo)致出錯。調(diào)試過程中最郁悶的事就是文件的打開關(guān)閉了。剛開始沒有注意這些問題,根本就沒有注意文件的重復(fù)打開問題,導(dǎo)致在這個(gè)函數(shù)里面打開了disk.txt文件,還沒有關(guān)閉,接下需要調(diào)用另外一個(gè)函數(shù),文件又在另外一個(gè)函數(shù)里面被打開,結(jié)果在另一個(gè)文件里面就根本讀不進(jìn)文件里面的數(shù)據(jù),因?yàn)檫@個(gè)毛病剛開始的時(shí)候出現(xiàn)了很多奇怪的現(xiàn)象,比如說在創(chuàng)建文件的函數(shù)里面,每創(chuàng)建一個(gè)函數(shù)申請一個(gè)盤塊,就算申請了好幾十個(gè)盤塊都沒有問題。但是同樣申請盤塊在文件的寫函數(shù)里就實(shí)現(xiàn)不了,因?yàn)樵趯懞瘮?shù)里面我已經(jīng)打

36、開了disk.txt文件,而在盤塊申請函數(shù)里面又打開了disk.txt文件。本來是想每申請一個(gè)盤塊,就先把內(nèi)容寫進(jìn)去,實(shí)現(xiàn)邊申請邊寫,結(jié)果申請到下一組的盤塊就會出錯,因?yàn)橄乱唤M的盤塊根本沒有讀進(jìn)棧。技術(shù)性的問題也有,就是剛開始很多地方都是打算用string類型的數(shù)來傳遞值的,結(jié)果cout還有很多string類型自帶的函數(shù)根本就不支持。查看了頭文件確實(shí)已經(jīng)包括了<string.h>,后來終于還是百度了這個(gè)問題,然后發(fā)現(xiàn)百度上的解答也是要求要包含string類型的頭文件,剛開始還不得解。然后無意間發(fā)現(xiàn)好像應(yīng)該是<string>。然后就真的可以了。在遞歸函數(shù)的實(shí)現(xiàn)上也碰到了問

37、題,因?yàn)槲沂窍肽夸浳募h除的時(shí)候,如果它包含了子目錄,那么通過遞歸,把它下面的子目錄先刪除了,等文件為空了再刪除該目錄。結(jié)果我在刪完第一個(gè)子目錄的時(shí)候再返回刪除第二個(gè)子目錄的時(shí)候就出錯了,最后發(fā)現(xiàn)還是disk.txt的關(guān)閉問題,因?yàn)槲以谶f歸之前并沒有關(guān)閉disk.txt文件,所以在調(diào)用遞歸的時(shí)候,進(jìn)入了這個(gè)函數(shù)又重復(fù)打開了該文件。剛開始在設(shè)計(jì)ls()函數(shù)的時(shí)候沒有考慮到子目錄的問題,只是簡單地想列出當(dāng)前目錄下的所有目錄項(xiàng),而沒有想把這些子目錄項(xiàng)中的子目錄也一起列出來,最后也是通過了遞歸讀入目錄項(xiàng),實(shí)現(xiàn)了這個(gè)功能。在寫創(chuàng)建用戶umask碼的時(shí)候理解這個(gè)東西還是挺困難的,剛開始真的不理解,于是就直接用w、r來代替了,雖然說用戶屏蔽碼最后就是用來計(jì)算權(quán)限的,但是經(jīng)過讀懂之后,還是不厭其煩的改動了整個(gè)程序,增加了一個(gè)用戶類。全局變量里面設(shè)定了系統(tǒng)屏蔽碼,用戶屏蔽碼就寫在了用戶的類里面,每個(gè)用戶都自帶自己的用戶umask碼。 2.實(shí)驗(yàn)感悟本次試驗(yàn)最大的體會就是個(gè)人工作與小組工作的差別,這次實(shí)驗(yàn)我選擇了個(gè)人獨(dú)立來完成,主要是想體驗(yàn)一下一個(gè)人獨(dú)立完成一個(gè)完整的程序的感受。剛開始的時(shí)候我認(rèn)真去看了第六章的上課P

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論