優(yōu)秀畢業(yè)設(shè)計(jì)精品模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第1頁
優(yōu)秀畢業(yè)設(shè)計(jì)精品模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第2頁
優(yōu)秀畢業(yè)設(shè)計(jì)精品模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第3頁
優(yōu)秀畢業(yè)設(shè)計(jì)精品模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第4頁
優(yōu)秀畢業(yè)設(shè)計(jì)精品模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、*實(shí)踐教學(xué)* xx理工大學(xué)計(jì)算機(jī)與通信學(xué)院2008年秋季學(xué)期操作系統(tǒng)原理課程設(shè)計(jì)題 目: 模擬unix文件系統(tǒng)專業(yè)班級(jí): 計(jì)算機(jī) 班 姓 名: xxxxx 學(xué) 號(hào): xxxxxxx 指導(dǎo)教師: xxxx 成 績: 目錄1.摘要22.問題描述23.設(shè)計(jì)目的24.設(shè)計(jì)要求25.詳細(xì)設(shè)計(jì)25.1界面設(shè)計(jì)35.1算法設(shè)計(jì).36.設(shè)計(jì)總結(jié)37. 參考文獻(xiàn)48.致謝49.附錄22模擬unix文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)1. 課程設(shè)計(jì)內(nèi)容多用戶的多級(jí)目錄的文件系統(tǒng)設(shè)計(jì)。2. 概述 unix采用樹型目錄結(jié)構(gòu),每個(gè)目錄表稱為一個(gè)目錄文件。一個(gè)目錄文件是由目錄項(xiàng)組成的。每個(gè)目錄項(xiàng)包含16b,一個(gè)輔存磁盤塊(512b)包含

2、32個(gè)目錄項(xiàng)。在目錄項(xiàng)中,第1、2字節(jié)為相應(yīng)文件的外存i節(jié)點(diǎn)號(hào),是該文件的內(nèi)部標(biāo)識(shí);后14b為文件名,是該文件的外部標(biāo)識(shí)。所以,文件目錄項(xiàng)記錄了文件內(nèi)、外部標(biāo)識(shí)的對(duì)照關(guān)系。根據(jù)文件名可以找到輔存i節(jié)點(diǎn)號(hào),由此便得到該文件的所有者、存取權(quán)、文件數(shù)據(jù)的地址健在等信息。unix的存儲(chǔ)介質(zhì)以512b為單位劃分為塊,從0開始直到最大容量并順序加以編號(hào)就成了一個(gè)文件卷,也叫文件系統(tǒng)。unix中的文件系統(tǒng)磁盤存儲(chǔ)區(qū)分配圖如下:0#1#2#k#k+1#k+2#k+3#n#i節(jié)點(diǎn)區(qū)文件存儲(chǔ)區(qū)引導(dǎo)區(qū)管理區(qū)本次課程設(shè)計(jì)是要實(shí)現(xiàn)一個(gè)簡單的模擬unix文件系統(tǒng)。我們?cè)趦?nèi)存中開辟一個(gè)虛擬磁盤空間(1mb)作為文件存儲(chǔ)器,

3、并將該虛擬文件系統(tǒng)保存到磁盤上(以一個(gè)文件的形式),以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中。文件存儲(chǔ)空間的管理可采用位示圖方法。3. 課程設(shè)計(jì)任務(wù)及要求3.1. 設(shè)計(jì)任務(wù)多用戶、多級(jí)目錄結(jié)構(gòu)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。可以實(shí)現(xiàn)下列幾條命令login 用戶登錄logout退出當(dāng)前用戶dir列文件目錄creat創(chuàng)建文件delete刪除文件open打開文件close關(guān)閉文件read讀文件write 寫文件mkdir創(chuàng)建目錄ch改變文件目錄rd刪除目錄樹format格式化文件系統(tǒng)quit退出文件系統(tǒng)3.2. 設(shè)計(jì)要求1) 多用戶 :usr1,usr2,usr3,usr8 (1-8個(gè)用戶) 2) 多級(jí)目

4、錄:可有多級(jí)子目錄;3) 具有l(wèi)ogin (用戶登錄)4) 系統(tǒng)初始化(建文件卷、提供登錄模塊)5) 文件的創(chuàng)建:create (用命令行來實(shí)現(xiàn)) 6) 文件的打開:open7) 文件的讀:read 8) 文件的寫:write9) 文件關(guān)閉:close 10) 刪除文件:delete11) 創(chuàng)建目錄(建立子目錄):mkdir 12) 改變當(dāng)前目錄:cd13) 列出文件目錄:dir14) 退出:logout新增加的功能:15) 刪除目錄樹:rd16) 格式化文件系統(tǒng):format4. 算法及數(shù)據(jù)結(jié)構(gòu)4.1. 算法的總體思想本課程設(shè)計(jì)是要求我們模擬unix文件系統(tǒng)功能設(shè)計(jì)一個(gè)虛擬文件系統(tǒng),依據(jù)un

5、ix文件系統(tǒng)的特點(diǎn),其設(shè)計(jì)思想是:申請(qǐng)1m的內(nèi)存空間來虛擬文件系統(tǒng),將其以512b每塊劃分2048塊,采用位示圖管理文件系統(tǒng)的方法,利用其原理將第1塊作為位圖區(qū)(512b),共有對(duì)i節(jié)點(diǎn)區(qū)和數(shù)據(jù)塊區(qū)分別建立位圖;每個(gè)i節(jié)點(diǎn)占16b,每塊有512/16=32個(gè)i節(jié)點(diǎn),用2、3共兩塊作為i節(jié)點(diǎn),總共有64個(gè)i節(jié)點(diǎn),在位圖區(qū)占用8b;其余2045塊作為數(shù)據(jù)區(qū)(本課設(shè)要求只用到512塊),在位圖區(qū)占用接近256b(2045位)。文件系統(tǒng)存儲(chǔ)區(qū)分配圖如下:位圖區(qū)i節(jié)點(diǎn)區(qū)數(shù)據(jù)區(qū)位圖:用0表示未使用,1表示使用;i節(jié)點(diǎn):文件控制塊(fcb),描述文件信息的一個(gè)數(shù)據(jù)結(jié)構(gòu);數(shù)據(jù)區(qū):存放用戶數(shù)據(jù),包括目錄文件。位

6、示圖用以反映整個(gè)存儲(chǔ)空間的分配情況,由若干字節(jié)構(gòu)成,每個(gè)字節(jié)中的每一位對(duì)應(yīng)文件存儲(chǔ)器中的一塊,“1”狀態(tài)表示相應(yīng)塊已占用,“0”狀態(tài)表示該塊為空閑。存儲(chǔ)塊分配時(shí),只要把找到的空閑塊所對(duì)應(yīng)的位由 "0" 改為 "1", 而在釋放時(shí),只要把被釋放的物理塊所對(duì)應(yīng)的位由 "1" 改為 " 0 " 即可。分配和釋放都可以在內(nèi)存的位示 圖上完成,而且速度較快。磁盤 i 節(jié)點(diǎn)利用在內(nèi)存中生成鏈表或者數(shù)組的方法來生成,并且限制磁盤節(jié)點(diǎn)數(shù)的最大值。同樣內(nèi)存 i 節(jié)點(diǎn)利用鏈表的方法在內(nèi)存中生成。同時(shí)在往文件中 寫或者讀的時(shí)候我們都是對(duì)

7、內(nèi)存中有內(nèi)容進(jìn)行讀寫。在該文件系統(tǒng)中,規(guī)定一個(gè)文件最多只能占用2個(gè)數(shù)據(jù)塊,這兩個(gè)數(shù)據(jù)塊可以是不連續(xù)的,其塊號(hào)記錄在一個(gè)索引塊中,該索引塊稱為inode結(jié)構(gòu)。讀入一個(gè)文件時(shí),先根據(jù)目錄找到相應(yīng)的i節(jié)點(diǎn)號(hào),將i節(jié)點(diǎn)讀入主存i節(jié)點(diǎn),建立打開文件表指向該主存i節(jié)點(diǎn),再將文件內(nèi)容讀入主存數(shù)據(jù)區(qū)。4.2. 系統(tǒng)總體框架圖4.3. 系統(tǒng)總體流程圖開始文件系統(tǒng)是否建立?在內(nèi)存中申請(qǐng)1m內(nèi)存空間將磁盤上的文件系統(tǒng)讀入內(nèi)存yn用戶登錄模塊,輸入用戶名和密碼,可以在程序中設(shè)定,不用保存在文件系統(tǒng)中用戶名、密碼對(duì)嗎?執(zhí)行init(),進(jìn)行初始化操作,進(jìn)入用戶子目錄執(zhí)行command(),對(duì)用戶輸入的命令進(jìn)行解析和執(zhí)行

8、。若數(shù)據(jù)被修改或新建立,則保存主存i節(jié)點(diǎn)和數(shù)據(jù)塊的內(nèi)容到內(nèi)存的文件系統(tǒng),并寫回磁盤,保存修改。若輸入錯(cuò)誤命令則顯示出錯(cuò)信息。退出用戶(logout)嗎?用戶輸入quit嗎?結(jié)束執(zhí)行format(),建立文件系統(tǒng)nnnyyy4.4. 各模塊功能說明4.4.1format模塊功能:格式化文件系統(tǒng),即初始化文件系統(tǒng),相當(dāng)于硬盤的格式化。將其中原有的用戶及用戶下的文件系統(tǒng)全部還原初始狀態(tài),即沒有任何用戶和目錄、文件,也就是按設(shè)計(jì)的文件系統(tǒng)格式重建新的文件系統(tǒng)。4.4.2 get_blknum和release_blk模塊功能:實(shí)現(xiàn)i節(jié)點(diǎn)的分配和回收;算法:當(dāng)一個(gè)新的文件被建立時(shí),在給該文件分配磁盤存儲(chǔ)區(qū)

9、之前,應(yīng)為該文件分配存放該文件的說明信息的磁盤i節(jié)點(diǎn)。反之,當(dāng)從文件系統(tǒng)中刪除某個(gè)文件時(shí),則要首先刪除它的i節(jié)點(diǎn)項(xiàng)。4.4.3init()模塊功能:進(jìn)入文件系統(tǒng)算法:初始化用戶打開文件系表。在內(nèi)存中申請(qǐng)一個(gè)虛擬存儲(chǔ)空間,此空間必須大于或等于可格式化時(shí)的空間。將文件系統(tǒng)文件讀入虛擬磁盤。4.4.4 quit()模塊功能:退出文件系統(tǒng)函數(shù)quit()算法:將虛擬磁盤內(nèi)容保存到磁盤上。釋放虛擬磁盤所占據(jù)的空間。撤消用用戶打開文件表。4.4.5 creat()模塊功能:創(chuàng)建文件用法:creat filename算法:分配一空目錄項(xiàng),分配磁盤塊??捎梦皇緢D。填寫該空目錄項(xiàng)。如文件長度(0),文件名,類型

10、等。分配一個(gè)用戶打開文件表項(xiàng),并填寫相關(guān)目錄,讀寫指針=0。4.4.6 open()模塊功能:打開文件open()用法:open filename算法:if(該文件已打開or該文件不存在)報(bào)錯(cuò)(出錯(cuò)信息)。分配一個(gè)用戶打開文件表項(xiàng)。4.4.7 close()模塊功能:關(guān)閉文件close()用法:close filename算法:釋放該文件的用戶占據(jù)的內(nèi)存空間。清空該文件的用戶打開文件表目。4.4.8 write()模塊功能:寫文件write(fd,buf,len)用法:write filename,需要先打開文件。算法:指定寫入內(nèi)容長度。buf。修改打開文件表讀/寫指針。修改目錄項(xiàng)中的文件長度

11、。4.4.9 read()模塊功能:read(fd,buf,len)用法:read filename,需先打開文件。算法:文件信息.修改讀/寫指針。4.4.10 delete()模塊功能:刪除文件delete()用法:delete filename算法:若文件不存在,報(bào)錯(cuò)。回收磁盤空間。回收目錄項(xiàng)。4.5. 該文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和申明函數(shù)/ 用戶(20b)typedef structchar user_name10;/ 用戶名char password10;/ 密碼 user;/ i節(jié)點(diǎn)(32b)typedef structshortinum;/ 文件i節(jié)點(diǎn)號(hào)charfile_name10;/

12、 文件名chartype;/ 文件類型char user_name10; / 文件所有者shortiparent;/ 父目錄的i節(jié)點(diǎn)號(hào) shortlength;/ 文件長度shortaddress2;/ 存放文件的地址 inode;/ 打開文件表(16b)typedef structshort inum;/ i節(jié)點(diǎn)號(hào)char file_name10;/ 文件名short mode;/ 讀寫模式(1:read, 2:write, 3:read and write)short offset;/ 偏移量 file_table;/ 申明函數(shù)void login(void); 用戶登錄,如果是新用戶則創(chuàng)

13、建用戶void init(void); 程序初始化,將所有i節(jié)點(diǎn)讀入內(nèi)存int analyse(char *); 輸入?yún)?shù)分析,分析用戶命令void save_inode(int); 將num號(hào)i節(jié)點(diǎn)保存到虛擬磁盤文件hd.datint get_blknum(void); 申請(qǐng)一個(gè)數(shù)據(jù)塊void read_blk(int); 將i節(jié)點(diǎn)號(hào)為num的文件讀入tempvoid write_blk(int); 將temp的內(nèi)容寫入hd.dat的數(shù)據(jù)區(qū)void release_blk(int); 釋放文件塊號(hào)為num的文件占用的空間void pathset(); 打印當(dāng)前路徑void deltree(i

14、nt innum); 實(shí)現(xiàn)刪除目錄樹函數(shù)int check(int); 檢查用戶權(quán)限/ 用戶命令處理函數(shù)void help(void); 命令提示幫助函數(shù)void cd(void); 改變當(dāng)前目錄void dir(void); 顯示當(dāng)前目錄下所有文件和目錄void mkdir(void); 創(chuàng)建目錄void rd(void); 刪除目錄void creat(void); 創(chuàng)建文件void open(void); 打開void read(void); 讀文件void write(void); 寫文件void close(void); 關(guān)閉文件void del(void); 刪除文件void lo

15、gout(void); 用戶注銷void command(void); 命令管理函數(shù)void format(void); 格式化虛擬磁盤5. 程序設(shè)計(jì)與實(shí)現(xiàn)5.1. 主要函數(shù)列表函數(shù)原型功能入口、出口參數(shù)說明void login(void)用戶登陸void init(void)程序初始化int analyse(char *)輸入?yún)?shù)分析命令行字符串void save_inode(int)保存i節(jié)點(diǎn)到虛擬磁盤文件i節(jié)點(diǎn)號(hào)int get_blknum(void)分配一個(gè)磁盤塊void read_blk(int)讀磁盤快內(nèi)容i節(jié)點(diǎn)號(hào)void write_blk(int)寫磁盤塊i節(jié)點(diǎn)號(hào)void re

16、lease_blk(int)釋放一個(gè)磁盤塊i節(jié)點(diǎn)號(hào)void pathset();打印當(dāng)前路徑void deltree(int innum);實(shí)現(xiàn)刪除目錄樹函數(shù)i節(jié)點(diǎn)號(hào)int check(int);檢查用戶權(quán)限i節(jié)點(diǎn)號(hào)void help(void)命令提示幫助函數(shù)void dir(void)顯示當(dāng)前目錄下所有文件和目錄void mkdir(void)創(chuàng)建目錄void creat(void)創(chuàng)建文件void open(void)打開文件void read(void)讀文件void write(void)寫文件void close(void)關(guān)閉文件void del(void)刪除文件void lo

17、gout(void)用戶登出void command(void)命令管理函數(shù)void rd(void)刪除目錄void format(void);格式化虛擬磁盤5.2. 函數(shù)之間的關(guān)系main()login()init()command()analyse()help()cd()dir()mkdir()creat()open()read()write()close()del()logout()cls()errcmd()format()quit()rd()save_inode()read_blk()get_blknum()write_blk()release_blk()delet()5.3. 程序

18、流程圖各功能模塊流程圖是否否是提示輸入用戶名和密碼用戶名是否存在創(chuàng)建新用戶讀入用戶信息到內(nèi)存開始密碼是否正確結(jié)束用戶登陸login() 讀入位示圖信息到內(nèi)存讀入i節(jié)點(diǎn)信息到內(nèi)存當(dāng)前目錄為根目錄初始化打開文件表結(jié)束開始初始化函數(shù)init()是是否否遍歷i節(jié)點(diǎn)區(qū)argv1=”.”目錄是否存在找到的目錄i節(jié)點(diǎn)號(hào)送當(dāng)前目錄inum_cur當(dāng)前目錄的父i節(jié)點(diǎn)號(hào)送當(dāng)前目錄inum_cur開始結(jié)束改變當(dāng)前目錄cd() 是是否否遍歷i節(jié)點(diǎn)區(qū)i節(jié)點(diǎn)的父節(jié)點(diǎn)是否為當(dāng)前目錄i節(jié)點(diǎn)區(qū)是否遍歷完輸出文件名或目錄名開始結(jié)束顯示目錄dir()是是否否遍歷i節(jié)點(diǎn)區(qū)要?jiǎng)?chuàng)建的目錄是否存在是否有空的i節(jié)點(diǎn)遍歷i節(jié)點(diǎn)區(qū)分配一個(gè)目錄i

19、節(jié)點(diǎn)開始結(jié)束創(chuàng)建目錄mkdir() 是是否否遍歷i節(jié)點(diǎn)區(qū)要?jiǎng)?chuàng)建的文件是否存在是否有空的i節(jié)點(diǎn)遍歷i節(jié)點(diǎn)區(qū)分配一個(gè)文件i節(jié)點(diǎn)開始結(jié)束創(chuàng)建文件creat()是否是否是否遍歷i節(jié)點(diǎn)區(qū)要打開的文件是否存在提示輸入打開模式將打開文件信息寫入打開文件信息表file_array遍歷打開文件表file_array文件是否已經(jīng)打開提示輸入開始位置和讀字節(jié)數(shù)調(diào)用讀塊操作,讀出塊內(nèi)字符模式是否為可讀開始結(jié)束開始結(jié)束打開文件open()讀文件read()是否是否遍歷打開文件表file_array文件是否已經(jīng)打開提示輸入寫入字節(jié)數(shù)調(diào)用寫塊操作,寫入塊內(nèi)字符模式是否為可寫是否遍歷打開文件表file_array文件是否已經(jīng)

20、打開將打開文件表項(xiàng)標(biāo)志位置-1file_arrayi.inum = -1開始結(jié)束寫文件write()開始結(jié)束關(guān)閉文件close()是否遍歷i節(jié)點(diǎn)區(qū)要?jiǎng)h除的文件是否存在釋放文件對(duì)應(yīng)的i節(jié)點(diǎn)區(qū)inode_arrayi.inum = -1釋放兩個(gè)磁盤塊文件是否大于的一塊釋放一個(gè)磁盤塊是否開始結(jié)束刪除文件del() 開始遍歷i節(jié)點(diǎn)區(qū)是待刪除目錄嗎?遍歷子目錄子目錄為空嗎?是文件嗎?是空目錄嗎?結(jié)束調(diào)用delet()刪除目錄或文件是空目錄嗎?刪除目錄樹rd()是是否否否否否是是是是否遍歷位示圖表查找空閑塊bitmap是否有空閑塊分配一塊,將位示圖位置置1。 bitmapi = '1'返回

21、找到的空閑塊號(hào)將位示圖位置置0。 bitmapi = '0'清空塊內(nèi)容開始結(jié)束分配磁盤塊get_blk()開始結(jié)束釋放磁盤塊release_blk(int)是否輸出給定i節(jié)點(diǎn)對(duì)應(yīng)的第1塊內(nèi)容文件是否大于1塊輸出給定i節(jié)點(diǎn)對(duì)應(yīng)的第2塊內(nèi)容是否將緩沖區(qū)buf內(nèi)容寫入第1塊buf內(nèi)容是否大于512字節(jié)將緩沖區(qū)buf的512字節(jié)后面的內(nèi)容寫入第2塊開始結(jié)束寫磁盤塊write_blk(int)開始結(jié)束讀磁盤塊read_blk(int)5.4. 源程序/*main.c*/#include "head.h"charchoice;intargc;/ 用戶命令的參數(shù)個(gè)數(shù)cha

22、r*argv5;/ 用戶命令的參數(shù)intinum_cur;/ 當(dāng)前目錄chartemp2*blksize;/ 緩沖區(qū)useruser;/ 當(dāng)前的用戶charbitmapblknum;/ 位圖數(shù)組inodeinode_arrayinodenum;/ i節(jié)點(diǎn)數(shù)組file_table file_arrayfilenum;/ 打開文件表數(shù)組charimage_name10 = "hd.dat"/ 文件系統(tǒng)名稱file*fp;/ 打開文件指針/創(chuàng)建映像hd,并將所有用戶和文件清除void format(void)file *fp;int i;inode inode;printf(&q

23、uot;will be to format filesystem.n");printf("warning:all data on this filesystem will be lost!n");printf("proceed with format(y/n)?");scanf("%c", &choice);gets(temp);if(choice = 'y') | (choice = 'y')if(fp=fopen(image_name, "w+b") = nul

24、l) printf("can't create file %sn", image_name); exit(-1);for(i = 0; i < blksize; i+) fputc('0', fp); inode.inum = 0; strcpy(inode.file_name, "/"); inode.type = 'd' strcpy(inode.user_name, "all"); inode.iparent = 0; inode.length = 0; inode.address0

25、 = -1; inode.address1 = -1; fwrite(&inode, sizeof(inode), 1, fp); inode.inum = -1; for(i = 0; i < 31; i+) fwrite(&inode, sizeof(inode), 1, fp); for(i = 0; i < blknum*blksize; i+) fputc('0', fp); fclose(fp);/ 打開文件user.txtif(fp=fopen("user.txt", "w+") = null)

26、printf("can't create file %sn", "user.txt"); exit(-1);fclose(fp);printf("filesystem created successful.please first login!n");return ;/ 功能: 用戶登陸,如果是新用戶則創(chuàng)建用戶void login(void)char *p;int flag;char user_name10;char password10;char file_name10 = "user.txt"do pr

27、intf("login:");gets(user_name);printf("password:");p=password;while(*p=getch()if(*p = 0x0d) /當(dāng)輸入回車鍵時(shí),0x0d為回車鍵的ascii碼*p='0' /將輸入的回車鍵轉(zhuǎn)換成空格break;printf("*"); /將輸入的密碼以"*"號(hào)顯示p+;flag = 0;if(fp = fopen(file_name, "r+") = null)printf("ncan't

28、 open file %s.n", file_name);printf("this filesystem not exist, it will be create!n");format();login();while(!feof(fp)fread(&user, sizeof(user), 1, fp);/ 已經(jīng)存在的用戶, 且密碼正確if(!strcmp(user.user_name, user_name) && !strcmp(user.password, password)fclose(fp);printf("n")

29、;return ;/ 已經(jīng)存在的用戶, 但密碼錯(cuò)誤else if(!strcmp(user.user_name, user_name)printf("nthis user is exist, but password is incorrect.n");flag = 1;fclose(fp);break;if(flag = 0) break;while(flag);/ 創(chuàng)建新用戶if(flag = 0)printf("ndo you want to creat a new user?(y/n):");scanf("%c", &c

30、hoice);gets(temp);if(choice = 'y') | (choice = 'y')strcpy(user.user_name, user_name);strcpy(user.password, password);fwrite(&user, sizeof(user), 1, fp);fclose(fp);return ;if(choice = 'n') | (choice = 'n')login();/ 功能: 將所有i節(jié)點(diǎn)讀入內(nèi)存void init(void)int i;if(fp = fopen(i

31、mage_name, "r+b") = null)printf("can't open file %s.n", image_name);exit(-1);/ 讀入位圖for(i = 0; i < blknum; i+)bitmapi = fgetc(fp);/ 顯示位圖/ 讀入i節(jié)點(diǎn)信息for(i = 0; i < inodenum; i+)fread(&inode_arrayi, sizeof(inode), 1, fp);/ 顯示i節(jié)點(diǎn)/ 當(dāng)前目錄為根目錄inum_cur = 0;/ 初始化打開文件表for(i = 0;

32、i < filenum; i+)file_arrayi.inum = -1;/ 功能: 分析用戶命令, 將分析結(jié)果填充argc和argv/ 結(jié)果: 0-14為系統(tǒng)命令, 15為命令錯(cuò)誤int analyse(char *str)int i;char temp20;char *ptr_char;char *syscmd="help", "cd", "dir", "mkdir", "creat", "open", "read", "write&

33、quot;, "close", "delete", "logout", "clear","format","quit","rd"argc = 0;for(i = 0, ptr_char = str; *ptr_char != '0' ptr_char+)if(*ptr_char != ' ')while(*ptr_char != ' ' && (*ptr_char != '0'

34、)tempi+ = *ptr_char+;argvargc = (char *)malloc(i+1);strncpy(argvargc, temp, i);argvargci = '0'argc+;i = 0;if(*ptr_char = '0') break;if(argc != 0) for(i = 0; (i < 15) && strcmp(argv0, syscmdi); i+);return i;else return 15;/ 功能: 將num號(hào)i節(jié)點(diǎn)保存到hd.datvoid save_inode(int num)if(fp

35、=fopen(image_name, "r+b") = null)printf("can't open file %sn", image_name);exit(-1);fseek(fp, 512+num*sizeof(inode), seek_set);fwrite(&inode_arraynum, sizeof(inode), 1, fp);fclose(fp);/ 功能: 申請(qǐng)一個(gè)數(shù)據(jù)塊int get_blknum(void)int i;for(i = 0; i < blknum; i+)if(bitmapi = '0&

36、#39;) break;/ 未找到空閑數(shù)據(jù)塊if(i = blknum)printf("data area is full.n");exit(-1);bitmapi = '1'if(fp=fopen(image_name, "r+b") = null)printf("can't open file %sn", image_name);exit(-1);fseek(fp, i, seek_set);fputc('1', fp);fclose(fp);return i;/ 功能: 將i節(jié)點(diǎn)號(hào)為num

37、的文件讀入temp void read_blk(int num)int i, len;char ch;int add0, add1;len = inode_arraynum.length;add0 = inode_arraynum.address0;if(len > 512)add1 = inode_arraynum.address1;if(fp = fopen(image_name, "r+b") = null)printf("can't open file %s.n", image_name);exit(-1);fseek(fp, 15

38、36+add0*blksize, seek_set);ch = fgetc(fp);for(i=0; (i < len) && (ch != '0') && (i < 512); i+)tempi = ch;ch = fgetc(fp);if(i >= 512)fseek(fp, 1536+add1*blksize, seek_set);ch = fgetc(fp);for(; (i < len) && (ch != '0'); i+)tempi = ch;ch = fgetc(fp);te

39、mpi = '0'fclose(fp);/ 功能: 將temp的內(nèi)容輸入hd的數(shù)據(jù)區(qū)void write_blk(int num)int i, len;int add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.length;if(fp = fopen(image_name, "r+b") = null)printf("can't open file %s.n", image_name);exit(-1);fseek(fp, 1536+add0*blksiz

40、e, seek_set);for(i=0; (i<len)&&(tempi!='0')&&(i < 512); i+)fputc(tempi, fp);if(i = 512)add1 = inode_arraynum.address1;fseek(fp, 1536+add1*blksize, seek_set);for(; (i < len) && (tempi != '0'); i+)fputc(tempi, fp);fputc('0', fp);fclose(fp);/ 功能:

41、 釋放文件塊號(hào)為num的文件占用的空間void release_blk(int num)file *fp;if(fp=fopen(image_name, "r+b") = null)printf("can't open file %sn", image_name);exit(-1);bitmapnum = '0'fseek(fp, num, seek_set);fputc('0', fp);fclose(fp);/ 功能: 顯示幫助命令void help(void)printf("command: nhe

42、lp - show help menu nclear - clear the screen ncd - change directory nmkdir - make directory ncreat - create a new file nopen - open a exist file nread - read a file nwrite - write something to a file nclose - close a file ndelete - delete a exist file nformat - format a exist filesystem nlogout - e

43、xit user nrd - delete a directory nquit - exit this systemn");/設(shè)置文件路徑void pathset()char path50;int m,n;if(inode_arrayinum_cur.inum = 0)strcpy(path,user.user_name);elsestrcpy(path,user.user_name);m=0;n=inum_cur;while(m != inum_cur)while(inode_arrayn.iparent != m)n = inode_arrayn.iparent;strcat(p

44、ath,"/");strcat(path,inode_arrayn.file_name);m = n;n = inum_cur;printf("%s",path);/ 功能: 切換目錄(cd . 或者 cd dir1)void cd(void)int i;if(argc != 2)printf("command cd must have two args. n");return ;if(!strcmp(argv1, ".")inum_cur = inode_arrayinum_cur.iparent;else/ 遍

45、歷i節(jié)點(diǎn)數(shù)組for(i = 0; i < inodenum; i+)if(inode_arrayi.inum>0)&&(inode_arrayi.type='d')&&(inode_arrayi.iparent=inum_cur)&&!strcmp(inode_arrayi.file_name,argv1)&&check(i)break;if(i = inodenum) printf("this directory isn't exsited.n");else inum_cu

46、r = i;/ 功能: 顯示當(dāng)前目錄下的子目錄和文件(dir)void dir(void)int i;int dcount=0,fcount=0;short bcount=0;if(argc != 1)printf("command dir must have one args. n");return ;/ 遍歷i節(jié)點(diǎn)數(shù)組, 顯示當(dāng)前目錄下的子目錄和文件名for(i = 0; i < inodenum; i+)if(inode_arrayi.inum> 0) && (inode_arrayi.iparent = inum_cur)if(inode

47、_arrayi.type = 'd' && check(i)dcount+;printf("%-20s<dir>n", inode_arrayi.file_name);if(inode_arrayi.type = '-' && check(i)fcount+;bcount+=inode_arrayi.length;printf("%-20s%12d bytesn", inode_arrayi.file_name,inode_arrayi.length);printf("

48、n %d file(s)%11d bytesn",fcount,bcount);printf(" %d dir(s) %11d bytes freespacen",dcount,1024*1024-bcount);/ 功能: 刪除目錄樹(rd dir1)void rd()int i,j,t,flag=0;if(argc != 2)printf("command delete must have one args. n");return ;for(i = 0; i < inodenum; i+)/查找待刪除目錄if(inode_arrayi

49、.inum > 0) &&/是否為空(inode_arrayi.iparent = inum_cur) &&(inode_arrayi.type = 'd')&&(!strcmp(inode_arrayi.file_name,argv1)chk=check(i);/檢查用戶權(quán)限if(chk!=1) printf("this directory is not your !n");return ;else j=inode_arrayi.inum;for(t=0;t<inodenum;t+)if(inod

50、e_arrayt.inum>0)&&(inode_arrayt.iparent=j)&&(inode_arrayi.type = '-')delet(t);/目錄下有文件則刪除else if(inode_arrayt.inum>0)&&(inode_arrayt.iparent=j)&&(inode_arrayi.type = 'd')delet(t);/目錄下有空目錄則刪除if(t = inodenum)delet(j);/下層目錄為空刪除之if(i = inodenum)delet(

51、i);/待刪除目錄為空刪除之return;/ 功能: 在當(dāng)前目錄下創(chuàng)建子目錄(mkdir dir1)void mkdir(void)int i;if(argc != 2)printf("command mkdir must have two args. n");return ;/ 遍歷i節(jié)點(diǎn)數(shù)組, 查找未用的i節(jié)點(diǎn)for(i = 0; i < inodenum; i+)if(inode_arrayi.inum < 0) break;if(i = inodenum)printf("inode is full.n");exit(-1);inode

52、_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = 'd'strcpy(inode_arrayi.user_name,user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 在當(dāng)前目錄下創(chuàng)建文件(creat file1)void creat(void)int i;if(argc != 2)printf("command creat must ha

53、ve one args. n");return ;for(i = 0; i < inodenum; i+)if(inode_arrayi.inum > 0) &&(inode_arrayi.type = '-') &&!strcmp(inode_arrayi.file_name, argv1)printf("this file is exsit.n");return ;for(i = 0; i < inodenum; i+)if(inode_arrayi.inum < 0) break;if(i = inodenum)printf("inode is full.n");exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = '-'strcpy(inode

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論