版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 操作系統(tǒng)原理課程設(shè)計(jì)實(shí)踐報(bào)告全套設(shè)計(jì)加扣 3012250582題 目:UNIX/Linux文件管理系統(tǒng)的仿真實(shí)驗(yàn)姓 名: 學(xué) 院: 信息科技學(xué)院 專 業(yè): 計(jì)算機(jī)科學(xué)技術(shù)系 班 級: 計(jì)科121 學(xué) 號: 指導(dǎo)教師: 職稱: 教授 2015年3月 18日摘要:unix/linux系統(tǒng)是當(dāng)前十分流行的一類操作系統(tǒng),而文件管理系統(tǒng)則是linux系統(tǒng)的重要組成部分。本文是在windows平臺上,依據(jù)linux文件管理系統(tǒng)的設(shè)計(jì)原理,參照模擬linux文件系統(tǒng)的結(jié)構(gòu),來實(shí)現(xiàn)linux文件管理系統(tǒng)的仿真。關(guān)鍵字:linux 仿真 文件管理系統(tǒng) 理論基礎(chǔ):Linux虛擬文件系統(tǒng)采用面向?qū)ο蟮脑O(shè)計(jì)思想,V
2、FS相當(dāng)于面向?qū)ο笙到y(tǒng)中的抽象類,它可派生不同子類以支持多種具體文件系統(tǒng)。但從效率考慮,內(nèi)核純粹的使用C語言編程,并未直接利用面向?qū)ο笳Z義。這里使用的術(shù)語“對象”,實(shí)際上是一個(gè)結(jié)構(gòu)體(struct),但它代表的的確是一個(gè)對象(object),每個(gè)對象都包含一個(gè)對象操作,描述內(nèi)核針對主要對象的可用方法。Linux下文件系統(tǒng)將文件權(quán)限與文件屬性這兩部分的數(shù)據(jù)放在不同的塊中,權(quán)限與屬性放在INODE中,他的實(shí)際數(shù)據(jù)房子data block 中,還有一個(gè)超級塊,叫做superblock會記錄整個(gè)文件系統(tǒng)的整體星系,包括inode與block的總量,使用量,剩余量根據(jù)INODE將block中的內(nèi)容讀出來
3、的數(shù)據(jù)訪問方式叫做索引式文件系統(tǒng),我們常用的U盤是fat格式的,這種文件系統(tǒng)沒有inode,無法將所有的block一口氣的讀出來,每個(gè)block號碼都是記錄在前一個(gè)block號碼當(dāng)中的,如果一個(gè)文件數(shù)據(jù)寫入的分散的太厲害,磁盤磁頭在磁盤轉(zhuǎn)一圈無法讀取到所有的數(shù)據(jù),因此fat的文件系統(tǒng)常常需要碎片整理。 1.目的及意義:1.1通過在windows系統(tǒng)上模擬linux的文件管理系統(tǒng),來熟悉書本上的linux的文件管理系統(tǒng)的原理,加深對于FVB和VFS的理解 1.2強(qiáng)化算法結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),1.3熟悉編程語言的使用2.設(shè)計(jì)思想及設(shè)計(jì)功能說明:2.1設(shè)計(jì)思想:先建立512個(gè)塊,每個(gè)塊對應(yīng)512個(gè)字節(jié),在
4、建立一個(gè)有512個(gè)元素的字符數(shù)組,每個(gè)元素對應(yīng)相應(yīng)的塊號,不管是文件或是目錄都有I節(jié)點(diǎn),建立自己設(shè)定數(shù)目元素的I節(jié)點(diǎn)表,并依次把位圖區(qū),I節(jié)點(diǎn)表,數(shù)據(jù)塊區(qū)每個(gè)元素映射到一個(gè)二進(jìn)制文件上。在每一次的操作中如果相應(yīng)元素有變動,則對應(yīng)在文件中更新輸出相應(yīng)數(shù)據(jù),以便下一次啟動程序的時(shí)候可以快速導(dǎo)入上一次的數(shù)據(jù)。2.2功能說明:(1)多用戶 :usr1,usr2,usr3,usr8 (1-8個(gè)用戶) (2)多級目錄:可有多級子目錄; (3)具有l(wèi)ogin (用戶登錄) (4)系統(tǒng)初始化(建文件卷、提供登錄模塊) (5)文件的創(chuàng)建:create (6)文件的打開:open (7)文件的讀:read (8)
5、文件的寫:write (9)文件關(guān)閉:close (10)文件重命名:rename (11)創(chuàng)建目錄(建立子目錄):mkdir (12)改變當(dāng)前目錄:cd (13)列出文件目錄:dir (14)刪除文件或目錄:delet(15)文件的硬鏈接:in (16)文件系統(tǒng)的格式化:format (17)退出:logout 2.3功能詳細(xì)說明:1.format模塊:格式化文件系統(tǒng),即初始化文件系統(tǒng),相當(dāng)于硬盤的格式化。將其中原有的用戶及用戶下的文件系統(tǒng)全部還原初始狀態(tài),即沒有任何用戶和目錄、文件,也就是按設(shè)計(jì)的文件系統(tǒng)格式重建新的文件系統(tǒng)。2. get_blknum和release_blk模塊:get_
6、blknum找到一個(gè)空閑數(shù)據(jù)塊,并修改對應(yīng)位圖號元素為1。release_blk修改對應(yīng)的位圖元素,并把文件系統(tǒng)中對應(yīng)的數(shù)據(jù)塊清零。3. init()模塊讀入文件系統(tǒng) 4.quit()模塊退出系統(tǒng)5 .creat()模塊 創(chuàng)建文件,分配一空目錄項(xiàng),分配磁盤塊。可用位示圖。填寫該空目錄 項(xiàng)。如文件長度(0),文件名,類型等。6. open()模塊打開文件,并判斷文件類型和打開方式。 如果文件沒有在文件打開表中就在文件打開表中建立該文件項(xiàng)。7. close()模塊關(guān)閉文件,刪除該文件的用戶打開文件表目。8. write()模塊寫文件,需要先打開文件。并判斷文件權(quán)限。寫完后修改文件系統(tǒng)中的對應(yīng)數(shù)據(jù)區(qū)
7、。9. read()模塊讀文件。需先打開文件。讀入相應(yīng)數(shù)據(jù)塊的內(nèi)容到緩沖區(qū),然后輸出。10.delet()模塊 如果參數(shù)是文件則刪除文件,如果是目錄則刪除該目錄下的所有文件和目錄。 11.mkdir()建立新的目錄,先在I節(jié)點(diǎn)表中找到一個(gè)未使用的,并初始化該I節(jié)點(diǎn),并在文件系統(tǒng)中對應(yīng)更新輸出。 12.cd()將當(dāng)前目錄切換到當(dāng)前目錄的一個(gè)子目錄下或當(dāng)前目錄的父目錄。13.in()創(chuàng)建硬鏈接,將幾個(gè)文件鏈接到用一個(gè)inode節(jié)點(diǎn)上。14.rename()將一個(gè)文件的名字重新命名3.核心數(shù)據(jù)結(jié)構(gòu)說明:3.1用戶結(jié)構(gòu)體 :模擬各個(gè)用戶,有用戶名和和登錄密碼兩個(gè)成員。typedef struct ch
8、ar user_name10; / 用戶名 char password10; / 密碼 User; 3.2inode 文件節(jié)點(diǎn)typedef struct short inum; / 文件i節(jié)點(diǎn)號 char file_name10; / 文件名 char type; / 文件類型(目錄、塊設(shè)備、字符設(shè)備、普通文件、權(quán)限等) char user_name10; / 文件所有者 short length; / 文件長度 short parent; / int likk; /硬鏈接的指針 int count; /文件鏈接的個(gè)數(shù),初始為0 char createtime64; /創(chuàng)建時(shí)間 short
9、address2; / 存放文件的地址,2*16=32位Inode;說明:索引節(jié)點(diǎn)是用來保存文件的各種屬性。文件名是文件的外部標(biāo)識,并不唯一(可以有同名文件,只要路徑不同),i節(jié)點(diǎn)號是文件的內(nèi)部標(biāo)識,是唯一的。Type指示文件的類型(f表示是普通文件,d表示是目錄文件)。user_name存儲了該文件的所有者(即用戶)的名字,parent存儲了該文件的父節(jié)點(diǎn)的i節(jié)點(diǎn)號。3.3打開文件表 typedef struct short inum; / i節(jié)點(diǎn)號 char file_name10; / 文件名 short parent; /父節(jié)點(diǎn)號 short mode; / 讀寫模式(1:只讀 2:只
10、寫 3:讀寫) File_table;說明:inum指的是打開文件的i節(jié)點(diǎn)號(用戶不可見);file_name指的是打開文件的文件名(用戶可見);parent指的是打開的文件的父節(jié)點(diǎn)的i節(jié)點(diǎn)號;mode指的是打開文件的權(quán)限(對文件的操作權(quán)限)。4.核心算法流程: 4.1用戶登錄:因?yàn)槭悄M的linux文件管理系統(tǒng),所以無法模擬進(jìn)程來調(diào)用文件,我們模擬用戶來代替進(jìn)程調(diào)用文件,不同的用戶相當(dāng)于不同的進(jìn)程。 是否否是提示輸入用戶名和密碼用戶名是否存在創(chuàng)建新用戶讀入用戶信息到內(nèi)存開始密碼是否正確結(jié)束用戶登陸login()4.2初始化(init):用戶登錄后,需要讀取二進(jìn)制文件(模擬的磁盤)中存儲的相關(guān)
11、數(shù)據(jù),來恢復(fù)以前所創(chuàng)建保存的文件及文件目錄樹。 讀入位示圖信息到內(nèi)存讀入i節(jié)點(diǎn)信息到內(nèi)存當(dāng)前目錄為根目錄初始化打開文件表結(jié)束開始初始化函數(shù)init() 4.3創(chuàng)建目錄(mkdir):linux文件系統(tǒng)中的文件分普通文件和目錄文件,目錄文件無法創(chuàng)建硬鏈接。 是是否否遍歷i節(jié)點(diǎn)區(qū)要創(chuàng)建的目錄是否存在是否有空的i節(jié)點(diǎn)遍歷i節(jié)點(diǎn)區(qū)分配一個(gè)目錄i節(jié)點(diǎn)開始結(jié)束創(chuàng)建目錄mkdir() 4.4:顯示目錄: 是是否否遍歷i節(jié)點(diǎn)區(qū)i節(jié)點(diǎn)的父節(jié)點(diǎn)是否為當(dāng)前目錄i節(jié)點(diǎn)區(qū)是否遍歷完輸出文件名或目錄名開始結(jié)束顯示目錄dir() 4.5改變當(dāng)前目錄:輸入cd xx命令來改變當(dāng)前目錄,實(shí)現(xiàn)目錄的變更。 是是否否遍歷i節(jié)點(diǎn)區(qū)a
12、rgv1=”.”目錄是否存在找到的目錄i節(jié)點(diǎn)號送當(dāng)前目錄inum_cur當(dāng)前目錄的父i節(jié)點(diǎn)號送當(dāng)前目錄inum_cur開始結(jié)束改變當(dāng)前目錄cd() 4.6創(chuàng)建文件:首先判斷所要創(chuàng)建的文件的文件名是否在該目錄下已存在,若已存在,則提示已有同名文件存在;若不存在,則創(chuàng)建該普通文件。 開始遍歷i節(jié)點(diǎn)區(qū)判斷該目錄下是否有同名文件存在遍歷i節(jié)點(diǎn)區(qū)是否有空I節(jié)點(diǎn)分配一個(gè)空I節(jié)點(diǎn)結(jié)束否提示已有同名文件存在是是否4.7打開文件: 開始遍歷I節(jié)點(diǎn)區(qū)要打開的文件是否存在提示輸入打開模式將打開文件信息寫入打開文件信息表結(jié)束否是 4.8關(guān)閉文件: 開始遍歷打開文件表文件是否已打開是將打開文件表項(xiàng)標(biāo)志置為-1結(jié)束否5.
13、開發(fā)調(diào)試及運(yùn)行環(huán)境: 我們組實(shí)在vs2010這個(gè)開發(fā)平臺上,用c+語言來編寫程序,仿真實(shí)現(xiàn)linux文件管理系統(tǒng)的。調(diào)試需要安裝.net3.0以上版本。 6.功能說明及測試數(shù)據(jù)分析6.1用戶登錄打開運(yùn)行程序,首先會提示輸入用戶名和登錄密碼。第一次登陸,會提示創(chuàng)建文件user.txt來保存用戶名和密碼。Admin是用戶名,輸入密碼會以*的形式顯示,來保護(hù)用戶的安全。 6.2創(chuàng)建目錄,并顯示使用mkdir命令來創(chuàng)建一個(gè)目錄,使用dir命令來顯示當(dāng)前目錄下存在的所有的文件(包括普通文件和目錄文件)。圖中創(chuàng)建了一個(gè)名為a的目錄文件,當(dāng)前目錄下沒有普通文件,只有一個(gè)a目錄文件。6.3改變目錄輸入cd x
14、x來改變路徑,cd a是進(jìn)入a目錄文件。6.4創(chuàng)建普通文件Create命令是用來創(chuàng)建一個(gè)普通的文件。如果已經(jīng)存在同名的文件,則會提示該文件已存在。6.5打開文件Open命令是用來打開一個(gè)普通文件,打開時(shí)會提示選擇對該文件的操作權(quán)限,1.是只能讀取該文件,2.是只能寫該文件,3.是可讀可寫該文件。6.6寫文件Write命令式對文件進(jìn)行寫操作,輸入一串?dāng)?shù)據(jù)后,按住ctrl+z來結(jié)束寫操作。 6.7讀文件Read命令式對文件進(jìn)行讀操作,首先會顯示該文件的長度,zp.txt文件的長度是22個(gè)字節(jié),接著顯示該文件的內(nèi)容。 6.8刪除文件Delet命令是對文件執(zhí)行刪除操作,刪除普通文件時(shí),直接刪除;若刪除
15、一個(gè)目錄文件,則會把目錄里面的文件及子目錄一起刪除。6.9重命名Rename命令是對文件執(zhí)行重命名操作,如果文件的新名字重復(fù),則會提示該文件名已存在。 6.10創(chuàng)建硬鏈接In命令是創(chuàng)建硬鏈接。目錄文件是無法創(chuàng)建硬鏈接的。 6.11獲得文件的相關(guān)屬性Get命令是獲得文件的相關(guān)屬性,包括文件名,文件的類型,文件的所有者的名字,文件的創(chuàng)建時(shí)間。 6.12關(guān)閉文件6.13格式化文件管理系統(tǒng)Format命令是執(zhí)行的格式化文件管理系統(tǒng)的功能,將所有的數(shù)據(jù)全部清除,然后需重新添加用戶。 7.存在問題及改進(jìn) (1)由于我們使用的是固定的磁盤分塊方法,每個(gè)數(shù)據(jù)塊的大小為512B,如果沒有寫滿整個(gè)數(shù)據(jù)塊,剩余的空
16、間無法重新利用,所以存在著一定的空間資源浪費(fèi)的問題。 (2)我們使用的是位示圖的方式實(shí)現(xiàn)文件的空間管理,使用這種方法占用的開銷比較小,但這種方法在尋找空閑數(shù)據(jù)塊時(shí)比較的慢,需要從頭開始尋找,每次都這樣會浪費(fèi)不會少的時(shí)間。 改進(jìn)的方法:可以使用成組鏈接法。將空閑塊分成若干組,每100個(gè)空閑塊為一組,每組的第一空閑塊登記了下一組空閑塊的物理盤塊號和空閑塊總數(shù)。如果一個(gè)組的第二個(gè)空閑塊號等于0,則有特殊的含義,意味著該組是最后一組,即無下一個(gè)空閑塊。分配空閑塊的時(shí)候,從前往后分配,先從第一組開始分配,第一組空閑的100塊分完了,才進(jìn)入第二組。釋放空閑塊的時(shí)候正好相反,從后往前分配,先將釋放的空閑塊放
17、到第一組,第一組滿了,在第一組前再開辟一組,之前的第一組變成第二組。 這樣可以很方便快捷的尋找空閑的數(shù)據(jù)塊來存儲數(shù)據(jù)。(3)由于樹平和實(shí)力的局限性,我們沒有實(shí)現(xiàn)文件系統(tǒng)的軟鏈接,在文件的共享方面還模擬的不是很到位。 8.實(shí)踐體會及心得顧建東:開始時(shí),由于課堂上對于文件系統(tǒng)的講解不是很多,所以我們看書有點(diǎn)吃力,買的參考書上對于linux的講解也有點(diǎn)難以理解,所以進(jìn)度不是十分的順利,也參考了一些網(wǎng)上的代碼。但是通過我們的努力以及老師的知道,我們逐漸的理解書本上的原理,開始融會貫通教材內(nèi)容,掌握程序各功能模塊的工作原理,相互聯(lián)系和來龍去脈,完整地建立系統(tǒng)的概念。操作系統(tǒng)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)中的一門
18、重要基礎(chǔ)課,目的是讓我們了解操作系統(tǒng)的基本概念,理解計(jì)算機(jī)系統(tǒng)的資源如何組織,操作系統(tǒng)如何有效地管理這些系統(tǒng)資源,用戶如何通過操作系統(tǒng)與計(jì)算機(jī)系統(tǒng)打交道。通過課程設(shè)計(jì),可以進(jìn)一步理解在計(jì)算機(jī)系統(tǒng)上運(yùn)行的其它各類操作系統(tǒng),并懂得在操作系統(tǒng)的支持下建立自己的應(yīng)用系統(tǒng)。操作系統(tǒng)課程設(shè)計(jì),對于訓(xùn)練我們掌握程序設(shè)計(jì)、熟悉上機(jī)操作和程序調(diào)試技術(shù)都有重要作用。重點(diǎn)培養(yǎng)我們的思維能力、創(chuàng)新能力和排錯能力。這次的實(shí)踐活動,也激發(fā)了我的學(xué)習(xí)熱情和主動性,培養(yǎng)我的獨(dú)立工作能力,在實(shí)踐活動中,將所學(xué)知識綜合運(yùn)用,增長才干,并積累經(jīng)驗(yàn)。對編程語言又有了更深一層次的認(rèn)識,并對編程能力有所加強(qiáng),但還是很多的不足有待改進(jìn),對
19、于編程來說還需要大量的實(shí)踐,才能在發(fā)現(xiàn)問題和解決問題中前進(jìn)與提高。陳晨:開始時(shí)對課本上的理論缺乏理解在添加活動inode時(shí)花費(fèi)了10多個(gè)小時(shí)在添加相關(guān)功能與調(diào)試錯誤上,但在答辯的時(shí)候得知對活動inode理解有誤。課本上有關(guān)活動inode的部分:為此,Linux在系統(tǒng)所占用的內(nèi)存區(qū)內(nèi)開辟一張內(nèi)存索引節(jié)點(diǎn)表,又稱活動inode表,含有100個(gè)表項(xiàng),每個(gè)表項(xiàng)成為一個(gè)活動inode。磁盤inode反映文件靜態(tài)特性,活動inode反映文件動態(tài)特性。當(dāng)訪問某文件時(shí)。就申請一個(gè)空閑活動inode,把磁盤inode內(nèi)容復(fù)制給它,隨之就可用來控制文件讀寫。當(dāng)用戶關(guān)閉文件后,活動inode的內(nèi)容會寫到對應(yīng)磁盤in
20、ode中,再釋放活動inode以供它用。把FCB的主要內(nèi)容與索引節(jié)點(diǎn)號分開,不僅能夠加快目錄檢索速度,而且便于實(shí)現(xiàn)文件共享。對此我的理解是活動inode可能類似于一個(gè)快表,開始是空的,當(dāng)打開文件的時(shí)候,將文件內(nèi)容讀入內(nèi)存中,因?yàn)閮?nèi)存讀取速度比硬盤讀取速度快,從而達(dá)到加快文件讀寫速度的目的。這個(gè)想法的錯誤之處在于,如果一個(gè)文件的大小過大,壓根無法讀取到內(nèi)存中,即使可以讀取到內(nèi)存中,每打開一個(gè)文件就送到內(nèi)存中運(yùn)行是完全沒有效率的,也是不現(xiàn)實(shí)的。但我對老師講解的活動inode還有些疑問:老師說活動inode在初始化系統(tǒng)時(shí)就已經(jīng)讀入了信息,而課本上的相關(guān)內(nèi)容是“當(dāng)訪問某文件時(shí),就申請一個(gè)空閑活動ino
21、de,把磁盤inode內(nèi)容復(fù)制給它,隨之就可用來控制文件讀寫”。如果活動inode在一開始時(shí)就已經(jīng)讀入了信息,那么訪問文件時(shí)還會有空閑嗎?單旭: 在本次課設(shè)中,我主要負(fù)責(zé)的是文件系統(tǒng)內(nèi)的的登陸,文件的關(guān)閉,文件的刪除及文件的刪除后的空間的釋放,以及對文件 文件系統(tǒng)在登錄時(shí)需要將登錄時(shí)的權(quán)限賦給登陸的文件系統(tǒng),只有在該文件系統(tǒng)下,該用戶才可以進(jìn)行對文件系統(tǒng)的各種操作,而之前參考的是只要輸入對了賬號密碼就可以進(jìn)行對文件系統(tǒng)的操作。修改之后實(shí)現(xiàn)了書上文件系統(tǒng)的文件保護(hù)屬性,規(guī)定了該文件誰可以訪問,可以進(jìn)行何種操作。 在文件的關(guān)閉中,模擬了文件系統(tǒng)打開文件表file_array,將對應(yīng)節(jié)點(diǎn)打開文件表項(xiàng)
22、的值改為-1,從而實(shí)現(xiàn)關(guān)閉文件,而不是直接調(diào)用fclose直接關(guān)閉文件,實(shí)現(xiàn)了書中的利用系統(tǒng)打開文件表項(xiàng)來實(shí)現(xiàn)文件的關(guān)閉。 對文件的刪除中,并不是直接用remove函數(shù),而是在位圖bitmap中將該文件的位圖信息改為0,從而實(shí)現(xiàn)將文件所在的空間的標(biāo)識為空,下次可以繼續(xù)用,不僅刪除了文件,而且達(dá)到了釋放空間的目的。 增加了顯示當(dāng)前目錄下的子目錄和文件名的功能,通過遍歷i節(jié)點(diǎn)數(shù)組,從而統(tǒng)計(jì)出當(dāng)前目錄下的目錄文件和普通文件的數(shù)目。9.參考文獻(xiàn) 1.湯子瀛編.計(jì)算機(jī)操作系統(tǒng).西安電子科技大出版社。2.鄭扣根譯操作系統(tǒng)概念. 高等教育出版社。3.鄭阿奇 Linux內(nèi)核精析.電子工業(yè)出版社10.帶注釋的核
23、心部分源碼/定義常量#define BLKSIZE 512/ 數(shù)據(jù)塊的大小 #define BLKNUM 512/ 數(shù)據(jù)塊的塊數(shù)#define INODESIZE 32/ i節(jié)點(diǎn)的大小#define INODENUM 32/ i節(jié)點(diǎn)的數(shù)目#define FILENUM 8/ 打開文件表的數(shù)目/函數(shù)申明void login();/登陸void init();/inode讀入內(nèi)存int analyse(char *);/分析用戶命令void save_inode(int);/保存節(jié)點(diǎn)到文件系統(tǒng)int get_blknum();/獲取塊號void read_blk(int);/讀塊void writ
24、e_blk(int);/寫塊void release_blk(int);/釋放塊void pathset();/設(shè)置文件目錄void del(int);void help();/用戶幫助void cd();/改變當(dāng)前目錄void dir();/列出文件目錄void mkdir();/創(chuàng)建目錄void creat();/創(chuàng)建文件void open();/打開文件void read();/讀文件void write();/寫文件void close();/關(guān)閉文件void delet();/刪除文件void logout();/注銷void command();/void quit();/退出系統(tǒng)
25、#includevariable.h/*每個(gè)目錄項(xiàng)包含16B,在目錄項(xiàng)中,第1、2字節(jié)為相應(yīng)文件的外存i節(jié)點(diǎn)號,是該文件的內(nèi)部標(biāo)識;后14B為文件名,是該文件的外部標(biāo)識。*/定義全局變量 charchoice;/ Y/N y/nintargc;/ 用戶命令的參數(shù)個(gè)數(shù)char*argv5;/ 用戶命令的參數(shù) argv0為命令名,其他為參數(shù)。如create user,create為argv0intinum_cur;/ 當(dāng)前目錄chartemp2*BLKSIZE;/ 緩沖區(qū)Useruser;/ 當(dāng)前的用戶charbitmapBLKNUM;/ 位圖數(shù)組Inodeinode_arrayINODENUM;
26、/ i節(jié)點(diǎn)數(shù)組File_table file_arrayFILENUM;/ 打開文件表數(shù)組charimage_name10 = data.dat;/ 文件系統(tǒng)名稱FILE*fp;/ 打開文件指針void format()/格式化文件系統(tǒng)int i;Inode inode;printf(格式化文件系統(tǒng): Y/N?n);scanf(%c, &choice); getchar(); if(choice = y) | (choice = Y) if(fp=fopen(image_name, w+t) = NULL) /讀寫打開一個(gè)二進(jìn)制文件,若讀取失敗 /在磁盤中申請一個(gè)二進(jìn)制文件模擬UNIX內(nèi)存 p
27、rintf(無法創(chuàng)建文件%sn, image_name); exit(-1); /結(jié)束程序,在操作系統(tǒng)中一般0為正常退出,其他數(shù)字為不正常 for(i = 0; i BLKSIZE; i+)/如果讀取成功 fputc(0, fp);/將0寫到fp指向的位置,成功寫入會使fp后移1個(gè)字節(jié) inode.inum = 0; strcpy(inode.file_name, /); /將 /復(fù)制到inode.file_name開始的地址空間 inode.type = d; /文件類型為directory,目錄文件 strcpy(inode.user_name, /); /以下為初始化節(jié)點(diǎn)信息 inode
28、.parent = 0; inode.length = 0; inode.address0 = -1; inode.address1 = -1; fwrite(&inode, sizeof(Inode), 1, fp); /fwrite(指針,單字節(jié)數(shù),數(shù)據(jù)項(xiàng)個(gè)數(shù),指針) inode.inum = -1; /inode節(jié)點(diǎn)區(qū) for(i = 0; i 31; i+) fwrite(&inode, sizeof(Inode), 1, fp); for(i = 0; i BLKNUM*BLKSIZE; i+) fputc(0, fp);/清空數(shù)據(jù)塊 fclose(fp); if(fp=fopen(
29、user.txt, w+) = NULL) /讀寫打開user.txt,若打開成功,則刪除文件信息,失敗則新建 /FILE * fopen(const char * path,const char * mode); printf(無法創(chuàng)建文件user.txtn); exit(-1); fclose(fp); printf(文件系統(tǒng)初始化完畢,請登錄:n);return;void login()/用戶登陸與注冊char *p;int flag;char user_name10;char password10;char file_name10 = user.txt;/創(chuàng)建一個(gè)文本文檔保存用戶信息d
30、o printf(請輸入用戶名:); gets(user_name); /讀取字符串,以回車作為結(jié)束 printf(請輸入密碼:); p=password; while(*p=getch() if(*p = 0x0d) /回車 *p=0; /將輸入的回車鍵轉(zhuǎn)換成空格 break; printf(*); /將輸入的密碼以*號顯示 p+; flag = 0; /設(shè)計(jì)標(biāo)志位,循環(huán)登錄界面(應(yīng)對用戶輸錯密碼的情況) if(fp = fopen(file_name, r+) = NULL)/打開可讀寫文件user.txt printf(n無法打開 %s.n, file_name); printf(文件不
31、存在,將創(chuàng)建n); format();/初始化 login();/重新登陸 while(!feof(fp)/遍歷文件流,查找所有用戶,尋找匹配的用戶 fread(&user, sizeof(User), 1, fp);/讀取輸入流到user / 已經(jīng)存在的用戶, 且密碼正確 if(!strcmp(user.user_name, user_name) & !strcmp(user.password, password)/若用戶名與密碼匹配,strcmp函數(shù)返回0 fclose(fp); printf(n); return; / 已經(jīng)存在的用戶, 但密碼錯誤 else if(!strcmp(use
32、r.user_name, user_name) printf(n密碼不正確,請重新輸入:n); flag = 1; /如果用戶已存在但密碼錯誤,則一直循環(huán) fclose(fp); break; if(flag = 0) break;while(flag);/如果用戶已存在但密碼錯誤,則一直循環(huán)/ 用戶不存在,創(chuàng)建新用戶if(flag = 0) printf(n是否創(chuàng)建新用戶,Y/N?); scanf(%c, &choice); gets(temp); if(choice = y) | (choice = Y)/添加新用戶的信息到user.txt strcpy(user.user_name, u
33、ser_name); strcpy(user.password, password); fwrite(&user, sizeof(User), 1, fp); /將用戶名和密碼寫到user文本,確保下次登錄時(shí),該用戶存在 fclose(fp); return; if(choice = n) | (choice = N) login();void init()/將所有i節(jié)點(diǎn)讀入內(nèi)存int i;if(fp = fopen(image_name, r+b) = NULL)/讀寫打開,允許在結(jié)尾附加 printf(文件%s無法打開.n, image_name); exit(-1);for(i = 0;
34、 i BLKNUM; i+)/ 讀入位圖bitmapi = fgetc(fp);for(i = 0; i INODENUM; i+) /讀入i節(jié)點(diǎn)信息 fread(&inode_arrayi, sizeof(Inode), 1, fp);inum_cur = 0;/ 當(dāng)前目錄為根目錄for(i = 0; i FILENUM; i+)/ 初始化打開文件表 file_arrayi.inum = -1;/初始化時(shí),打開表中沒有表int get_blknum()/申請一個(gè)數(shù)據(jù)塊int i;for(i = 0; i 1fclose(fp);return i;void read_blk(int num)/
35、將i節(jié)點(diǎn)號為num的文件讀入temp int i, len;char ch;int add0, add1;len = inode_arraynum.length;/得到該inode節(jié)點(diǎn)的長度,即文件長度add0 = inode_arraynum.address0;/得到文件的地址/若文件的大小大于一個(gè)塊if(len 512) add1 = inode_arraynum.address1;if(fp = fopen(image_name, r+b) = NULL) printf(無法打開文件%s.n, image_name); exit(-1);fseek(fp, BLKSIZE+INODESI
36、ZE*INODENUM +add0*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(i=0; (i len) & (ch != 0) & (i = 512) fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); ch = fgetc(fp); for(; (i len) & (ch != 0); i+) tempi = ch; ch = fgetc(fp); tempi = 0;fclose(fp);void write_blk(int num)/將temp的內(nèi)容輸入數(shù)據(jù)區(qū)int i, len;in
37、t add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.length;if(fp = fopen(image_name, r+b) = NULL) printf(無法打開文件%s.n, image_name); exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);for(i=0; (ilen)&(tempi!=0)&(i 512); i+) fputc(tempi, fp);if(i = 512) add1 = inode_array
38、num.address1; fseek(fp, BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); for(; (i len) & (tempi != 0); i+) fputc(tempi, fp);fputc(0, fp);fclose(fp);void release_blk(int num)/釋放文件塊號為num的文件占用的空間FILE *fp;if(fp=fopen(image_name, r+b) = NULL) printf(無法打開文件%sn, image_name); exit(-1);bitmapnum = 0; /改變位
39、圖信息fseek(fp, num, SEEK_SET);fputc(0, fp);fclose(fp);void pathset()/設(shè)置文件路徑并顯示char path50;int m,n;if(inode_arrayinum_cur.inum = 0)/ strcpy(path,user.user_name);else/如果不是 strcpy(path,user.user_name); m=0; n=inum_cur; while(m != inum_cur) while(inode_arrayn.parent != m) n = inode_arrayn.parent;/ strcat(
40、path,/); strcat(path,inode_arrayn.file_name); m = n; n = inum_cur; printf(%s$,path);void getnowpath(char path150)/得到當(dāng)前文件路徑/char path50;int m,n;if(inode_arrayinum_cur.inum = 0)/ strcpy(path1,user.user_name);else/如果不是 strcpy(path1,user.user_name); m=0; n=inum_cur; while(m != inum_cur) while(inode_arra
41、yn.parent != m) n = inode_arrayn.parent;/ strcat(path1,/); strcat(path1,inode_arrayn.file_name); m = n; n = inum_cur; void getappointpath(Inode inodes,char path150)/得到指定的文件的路徑/char path50;int m,n;int inum_curs=inodes.parent;if(inode_arrayinum_curs.inum = 0) strcpy(path1,user.user_name);else/如果不是 str
42、cpy(path1,user.user_name); m=0; n=inum_cur; while(m != inum_curs) while(inode_arrayn.parent != m) n = inode_arrayn.parent;/ strcat(path1,/); strcat(path1,inode_arrayn.file_name); m = n; n = inum_curs; void getappointpath(File_table inodes,char path150)/得到指定的文件的路徑/char path50;int m,n;int inum_curs=inodes.parent;if(inode_arrayinum_curs.inum = 0) strcpy(path1,user.user_name);else/如果不是 strcpy(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025車輛保管合同書范文
- 2025保修工程合同范本
- 2025學(xué)校食堂承包合同書
- 2025關(guān)于試用期解除合同及案例
- 2025年度軍事電子對抗保密技術(shù)合同3篇
- 2025年度新能源充電設(shè)施建設(shè)公司合作協(xié)議書3篇
- 二零二五年度農(nóng)村房屋租賃合同(含農(nóng)業(yè)產(chǎn)業(yè)升級)
- 二零二五年度體育場館租賃合同及賽事運(yùn)營協(xié)議3篇
- 2025年度農(nóng)村個(gè)人地基使用權(quán)轉(zhuǎn)讓及農(nóng)業(yè)現(xiàn)代化設(shè)施配套協(xié)議書3篇
- 2025年度教育信息化項(xiàng)目經(jīng)理合作協(xié)議2篇
- 考務(wù)工作手冊(發(fā)給考務(wù)和監(jiān)考)
- 醫(yī)院科室合作共建協(xié)議 醫(yī)院科室合作協(xié)議書
- 醫(yī)務(wù)人員感染性職業(yè)暴露登記表
- qc成果提高剪力墻層間混凝土一次驗(yàn)收合格率
- 比賽獲獎?wù)n件-I-love-My-White-Shoes(繪本)
- 初中生物-《植物的生殖與發(fā)育》教學(xué)課件設(shè)計(jì)
- 手機(jī)大腦:讓人睡眠好、心情好、腦力好的戒手機(jī)指南
- 中考數(shù)學(xué)第一輪復(fù)習(xí)
- 一汽靖燁發(fā)動機(jī)有限公司安全文化知識手冊
- 高壓線防護(hù)架搭設(shè)施工方案
- 四川省成都市2021-2022學(xué)年高一(上)期末調(diào)研考試物理試題Word版含解析
評論
0/150
提交評論