操作系統(tǒng)模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第1頁
操作系統(tǒng)模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第2頁
操作系統(tǒng)模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第3頁
操作系統(tǒng)模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第4頁
操作系統(tǒng)模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)課程設(shè)計(jì) 模擬UNIX文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn) 院 系: 計(jì)算機(jī)學(xué)院二系 班 級(jí): 計(jì)07 2班 姓 名: 2009 年 6 月 10 日操作系統(tǒng)課程設(shè)計(jì)任務(wù)書一、題目:銀行家算法二、設(shè)計(jì)要求(1)吳勇克(組長(zhǎng))、劉勝光組成設(shè)計(jì)小組。(2)小組成員分工協(xié)作完成。要求每個(gè)成員有自己相對(duì)獨(dú)立的模塊,同時(shí)要了解其他組員完成的內(nèi)容。(3)查閱相關(guān)資料,自學(xué)具體課題中涉及到的新知識(shí)。(4)采用結(jié)構(gòu)化、模塊化程序設(shè)計(jì)方法設(shè)計(jì),功能要完善,界面美觀。(5)所設(shè)計(jì)的系統(tǒng)應(yīng)有菜單、動(dòng)畫和音樂。(6)按要求寫出課程設(shè)計(jì)報(bào)告,并于設(shè)計(jì)結(jié)束后1周內(nèi)提交。其主要內(nèi)容包括:封皮、課程設(shè)計(jì)任務(wù)書,指導(dǎo)教師評(píng)語與成績(jī)、目

2、錄、概述、軟件總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、軟件的調(diào)試、總結(jié)、謝啟、附錄:帶中文注釋的程序清單、參考文獻(xiàn)。報(bào)告一律用A4紙打印,中文字體為宋體,西文字體用Time New Roma,一律用小四號(hào)字,行距采用“固定值”18磅,首行縮進(jìn)2字符。總體設(shè)計(jì)應(yīng)配合軟件總體模塊結(jié)構(gòu)圖來說明軟件應(yīng)具有的功能。詳細(xì)設(shè)計(jì)應(yīng)用傳統(tǒng)或N-S流程圖和屏幕抓圖說明,調(diào)試的敘述應(yīng)配合出錯(cuò)場(chǎng)景的抓圖來說明出現(xiàn)了哪些錯(cuò)誤,如何解決的。三、課程設(shè)計(jì)工作量由于是設(shè)計(jì)小組團(tuán)結(jié)協(xié)作完成設(shè)計(jì)任務(wù),一般每人的程序量在200行有效程序行左右,不得抄襲。四、課程設(shè)計(jì)工作計(jì)劃2009年6月15日,指導(dǎo)教師講課,學(xué)生根據(jù)題目準(zhǔn)備資料;2009年6月16日

3、,設(shè)計(jì)小組進(jìn)行總體方案設(shè)計(jì)和任務(wù)分工;2009年16月16日2009年6月23日,每人完成自己承擔(dān)的程序模塊并通過獨(dú)立編譯;2009年6月23日2009年6月29日,將各模塊集成為一個(gè)完整的系統(tǒng),并錄入足夠的數(shù)據(jù)進(jìn)行調(diào)試運(yùn)行;2009年6月30日,驗(yàn)收、撰寫報(bào)告;2009年7月2日,驗(yàn)收或總結(jié)。 指導(dǎo)教師簽章 教研室主任簽章 目錄1. 概述12. 總體設(shè)計(jì).23. 詳細(xì)設(shè)計(jì)34. 代碼調(diào)試95. 總結(jié)116. 附錄127. 參考文獻(xiàn). 30一概述【課設(shè)原理】UNIX采用樹型目錄結(jié)構(gòu),每個(gè)目錄表稱為一個(gè)目錄文件。一個(gè)目錄文件是由目錄項(xiàng)組成的。每個(gè)目錄項(xiàng)包含16B,一個(gè)輔存磁盤塊(512B)包含3

4、2個(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è)簡(jiǎn)單的模擬UNIX文件系統(tǒng)。我們?cè)诖疟P中申請(qǐng)一個(gè)二進(jìn)制文件模擬UNIX內(nèi)存,依次初始化建

5、立位示圖區(qū),I節(jié)點(diǎn)區(qū),數(shù)據(jù)塊區(qū)。并給已打開的文件建立文件打開表?!菊n設(shè)內(nèi)容】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)建文件delet刪除文件及目錄樹open打開文件close關(guān)閉文件read讀文件write 寫文件mkdir創(chuàng)建目錄cd改變文件目錄format格式化文件系統(tǒng)quit退出文件系統(tǒng)2 文件系統(tǒng)應(yīng)具有的基本功能     (1)多用戶   :usr1,usr2,usr3,usr8     (1-8個(gè)用戶)    

6、 (2)多級(jí)目錄:可有多級(jí)子目錄;     (3)具有l(wèi)ogin   (用戶登錄)     (4)系統(tǒng)初始化(建文件卷、提供登錄模塊)     (5)文件的創(chuàng)建:   create     (6)文件的打開:open     (7)文件的讀:read     (8)文件的寫:write     (9)文件關(guān)閉:close     (10)刪除文件或目錄:delet       (11)創(chuàng)

7、建目錄(建立子目錄):mkdir     (12)改變當(dāng)前目錄:cd     (13)列出文件目錄:dir     (14)退出:logout   二總體設(shè)計(jì)【算法思想】先建立512個(gè)塊,每個(gè)塊對(duì)應(yīng)512個(gè)字節(jié),在建立一個(gè)有512個(gè)元素的字符數(shù)組,每個(gè)元素對(duì)應(yīng)相應(yīng)的塊號(hào),不管是文件或是目錄都有I節(jié)點(diǎn),建立自己設(shè)定數(shù)目元素的I節(jié)點(diǎn)表,并依次把位圖區(qū),I節(jié)點(diǎn)表,數(shù)據(jù)塊區(qū)每個(gè)元素映射到一個(gè)二進(jìn)制文件上。在每一次的操作中如果相應(yīng)元素有變動(dòng),則對(duì)應(yīng)在文件中更新輸出相應(yīng)數(shù)據(jù),以便下一次啟動(dòng)程序的時(shí)候可以快速導(dǎo)入上一次的數(shù)據(jù)?!鞠到y(tǒng)總體框

8、架圖】【系統(tǒng)總體流程圖】開始文件系統(tǒng)是否建立?在內(nèi)存中申請(qǐng)內(nèi)存空間將磁盤上的文件讀入內(nèi)存YN用戶登錄模塊,輸入用戶名和密碼,可以在程序中設(shè)定,不用保存在文件系統(tǒng)中用戶名、密碼對(duì)嗎?執(zhí)行init(),進(jìn)行初始化操作,進(jìn)入用戶子目錄執(zhí)行command(),對(duì)用戶輸入的命令進(jìn)行解析和執(zhí)行。若數(shù)據(jù)被修改或新建立,則保存主存i節(jié)點(diǎn)和數(shù)據(jù)塊的內(nèi)容到內(nèi)存的文件系統(tǒng),并寫回磁盤,保存修改。若輸入錯(cuò)誤命令則顯示出錯(cuò)信息。退出用戶(logout)嗎?用戶輸入quit嗎?結(jié)束執(zhí)行format(),建立文件系統(tǒng)NNNYYY三詳細(xì)設(shè)計(jì)【各模塊功能說明】1.format模塊功能:格式化文件系統(tǒng),即初始化文件系統(tǒng),相當(dāng)于硬

9、盤的格式化。將其中原有的用戶及用戶下的文件系統(tǒng)全部還原初始狀態(tài),即沒有任何用戶和目錄、文件,也就是按設(shè)計(jì)的文件系統(tǒng)格式重建新的文件系統(tǒng)。2. get_blknum和release_blk模塊功能:get_blknum找到一個(gè)空閑數(shù)據(jù)塊,并修改對(duì)應(yīng)位圖號(hào)元素為1。release_blk修改對(duì)應(yīng)的位圖元素,并把文件系統(tǒng)中對(duì)應(yīng)的數(shù)據(jù)塊清零。3. init()模塊功能: 讀入文件系統(tǒng) 4.quit()模塊功能:退出系統(tǒng)5 .creat()模塊功能: 創(chuàng)建文件,分配一空目錄項(xiàng),分配磁盤塊。可用位示圖。填寫該空目錄 項(xiàng)。如文件長(zhǎng)度(0),文件名,類型等。6. open()模塊功能:打開文件,并判斷文件類型

10、和打開方式。 如果文件沒有在文件打開表中就在文件打開表中建立該文件項(xiàng)。7. close()模塊功能:關(guān)閉文件,刪除該文件的用戶打開文件表目。8. write()模塊功能:寫文件,需要先打開文件。并判斷文件權(quán)限。寫完后修改文件系統(tǒng)中的對(duì)應(yīng)數(shù)據(jù)區(qū)。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)中對(duì)應(yīng)更新輸出。 12.cd() 功能:將當(dāng)前目錄切換到當(dāng)前

11、目錄的一個(gè)子目錄下或當(dāng)前目錄的父目錄。 程序流程圖各功能模塊流程圖是否否是提示輸入用戶名和密碼用戶名是否存在創(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)建的目錄是否存

12、在是否有空的i節(jié)點(diǎn)遍歷i節(jié)點(diǎn)區(qū)分配一個(gè)目錄i節(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)字符模式是否為可寫是否遍

13、歷打開文件表file_array文件是否已經(jīng)打開將打開文件表項(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é)束刪除文件delet() 四.代碼調(diào)試1. 初始化和登陸文件系統(tǒng)第一次運(yùn)行程序2. 建立新目錄,顯示當(dāng)前目錄下的文件和目錄,并轉(zhuǎn)到新目錄下3. 建立新的文件,打開,寫,讀。4. clear清屏后,dir查看當(dāng)前目錄下文件信息5.返回根目錄下,并刪除根目錄下所有子目錄和

14、文件6. logout退出登錄或quit退出程序。 五. 總結(jié)開始第一天構(gòu)思,不斷的篩選證明模擬UNIX下的內(nèi)存方法,并在網(wǎng)絡(luò)上查找相應(yīng)的UNIX環(huán)境資料。接下來幾天開始實(shí)踐動(dòng)手,從整體框架開始構(gòu)思,到各個(gè)細(xì)節(jié)端口的實(shí)現(xiàn)。操作系統(tǒng)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)中的一門重要基礎(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ì),對(duì)于訓(xùn)練我們掌握程序設(shè)計(jì)、熟悉上機(jī)操作和程序調(diào)試技術(shù)都有重

15、要作用。重點(diǎn)培養(yǎng)我們的思維能力、創(chuàng)新能力和排錯(cuò)能力。通過課程設(shè)計(jì),進(jìn)一步融會(huì)貫通教材內(nèi)容,掌握程序各功能模塊的工作原理,相互聯(lián)系和來龍去脈,完整地建立系統(tǒng)的概念。激發(fā)我的學(xué)習(xí)熱情和主動(dòng)性,培養(yǎng)我的獨(dú)立工作能力,在實(shí)踐活動(dòng)中,將所學(xué)知識(shí)綜合運(yùn)用,增長(zhǎng)才干,并積累經(jīng)驗(yàn)。對(duì)編程語言又有了更深一層次的認(rèn)識(shí),并對(duì)編程能力有所加強(qiáng),但還是很多的不足有待改進(jìn),對(duì)于編程來說還需要大量的實(shí)踐,才能在發(fā)現(xiàn)問題和解決問題中前進(jìn)與提高。 六附錄源代碼:/ head.h文件#include <stdio.h>#include <stdlib.h>#include <conio.h>#

16、include <string.h>#include<stack>using namespace std;#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ù)目/用戶 typedef structchar user_name10; / 用戶名char password10; / 密碼 User;/i節(jié)點(diǎn) typedef structshort inum;

17、/ 文件i節(jié)點(diǎn)號(hào)char file_name10; / 文件名char type; / 文件類型char user_name10; / 文件所有者short iparent; / 父目錄的i節(jié)點(diǎn)號(hào) short length; / 文件長(zhǎng)度short address2; / 存放文件的地址 Inode;/打開文件表 typedef structshort inum; / i節(jié)點(diǎn)號(hào)char file_name10; / 文件名short mode; / 讀寫模式(1:read, 2:write, / 3:read and write) File_table;/ 申明函數(shù)void login(voi

18、d);void init(void);int analyse(char *);void save_inode(int);int get_blknum(void);void read_blk(int);void write_blk(int);void release_blk(int);void pathset();void del(int);/ 用戶命令處理函數(shù) void help(void);void cd(void);void dir(void);void mkdir(void);void creat(void);void open(void);void read(void);void wr

19、ite(void);void close(void);void delet(void);void logout(void);void command(void);void quit();/main.cpp文件#include "head.h"/定義全局變量 charchoice;intargc;/ 用戶命令的參數(shù)個(gè)數(shù)char*argv5;/ 用戶命令的參數(shù)intinum_cur;/ 當(dāng)前目錄chartemp2*BLKSIZE;/ 緩沖區(qū)Useruser;/ 當(dāng)前的用戶charbitmapBLKNUM;/ 位圖數(shù)組Inodeinode_arrayINODENUM;/ i節(jié)點(diǎn)數(shù)

20、組File_table file_arrayFILENUM;/ 打開文件表數(shù)組charimage_name10 = "data.dat"/ 文件系統(tǒng)名稱FILE*fp;/ 打開文件指針/創(chuàng)建映像hd,并將所有用戶和文件清除void format(void)int i;Inode inode;printf("Will be to format filesystem.n");printf("WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!n");printf("Proceed w

21、ith Format(Y/N)?");scanf("%c", &choice); getchar(); if(choice = 'y') | (choice = 'Y') if(fp=fopen(image_name, "w+b") = NULL) printf("Can't create file %sn", image_name); exit(-1); for(i = 0; i < BLKSIZE; i+) fputc('0', fp); inode.

22、inum = 0; strcpy(inode.file_name, "/"); inode.type = 'd' strcpy(inode.user_name, "/"); inode.iparent = 0; inode.length = 0; inode.address0 = -1; inode.address1 = -1; fwrite(&inode, sizeof(Inode), 1, fp); inode.inum = -1; for(i = 0; i < 31; i+) fwrite(&inode, si

23、zeof(Inode), 1, fp); for(i = 0; i < BLKNUM*BLKSIZE; i+) fputc('0', fp); fclose(fp); / 打開文件user.txt if(fp=fopen("user.txt", "w+") = NULL) printf("Can't create file %sn", "user.txt"); exit(-1); fclose(fp); printf("Filesystem created successfu

24、l.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 printf("login:"); gets(user_name); printf("password:"); p=password; while(*p=getch() if(*p = 0x0d) *p='0'

25、; /將輸入的回車鍵轉(zhuǎn)換成空格 break; printf("*"); /將輸入的密碼以"*"號(hào)顯示 p+; flag = 0; if(fp = fopen(file_name, "r+") = NULL) printf("nCan't open file %s.n", file_name); printf("This filesystem not exist, it will be create!n"); format(); login(); while(!feof(fp) fread

26、(&user, sizeof(User), 1, fp); / 已經(jīng)存在的用戶, 且密碼正確 if(!strcmp(user.user_name, user_name) && !strcmp(user.password, password) fclose(fp); printf("n"); return ; / 已經(jīng)存在的用戶, 但密碼錯(cuò)誤 else if(!strcmp(user.user_name, user_name) printf("nThis user is exist, but password is incorrect.n&q

27、uot;); 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", &choice); gets(temp); if(choice = 'y') | (choice = 'Y') strcpy(user.user_name, user_name); strcpy(user.passwor

28、d, 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(image_name, "r+b") = NULL) printf("Can't open file %s.n", image_name); exit(-1);/ 讀入位圖for(i

29、= 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; i < FILENUM; i+)file_arrayi.inum = -1;/ 功能: 分析用戶命令, 將分析結(jié)果填充argc和argv/ 結(jié)果: 0-13為系統(tǒng)命令, 14為命令錯(cuò)誤int analyse(char

30、 *str)int i;char temp20;char *ptr_char;char *syscmd="help", "cd", "dir", "mkdir", "create", "open", "read", "write", "close", "delet", "logout", "clear","format","qu

31、it"argc = 0;for(i = 0, ptr_char = str; *ptr_char != '0' ptr_char+) if(*ptr_char != ' ') while(*ptr_char != ' ' && (*ptr_char != '0') tempi+ = *ptr_char+; argvargc = (char *)malloc(i+1); strncpy(argvargc, temp, i); argvargci = '0' argc+; i = 0; if(

32、*ptr_char = '0') break; if(argc != 0) for(i = 0; (i < 14) && strcmp(argv0, syscmdi); i+); return i;else return 14;/ 功能: 將num號(hào)i節(jié)點(diǎn)保存到hd.datvoid save_inode(int num)if(fp=fopen(image_name, "r+b") = NULL) printf("Can't open file %sn", image_name); exit(-1);fseek

33、(fp, BLKNUM +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') break;/ 未找到空閑數(shù)據(jù)塊if(i = BLKNUM) printf("Data area is full.n"); exit(-1);bitmapi = '1'

34、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的文件讀入temp void read_blk(int num)int i, len;char ch;int add0, add1;len = inode_arraynum.length;add0 = ino

35、de_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, BLKSIZE+INODESIZE*INODENUM +add0*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(i=0; (i < len) && (ch

36、 != '0') && (i < 512); i+) tempi = ch; ch = fgetc(fp);if(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);/ 功能: 將temp的內(nèi)容輸入hd的數(shù)據(jù)

37、區(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, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);for(i=0; (i&

38、lt;len)&&(tempi!='0')&&(i < 512); i+) fputc(tempi, fp);if(i = 512) add1 = inode_arraynum.address1; fseek(fp, BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); for(; (i < len) && (tempi != '0'); i+) fputc(tempi, fp);fputc('0', fp);fclose(fp);/ 功

39、能: 釋放文件塊號(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:

40、 n help - show help menu nclear - clear the screen ncd - change directory nmkdir - make directory ncreate - create a new file nopen - open a exist file nread - read a file nwrite - write something to a file nclose - close a file ndelet - delete a exist file or directory nformat - format a exist file

41、system nlogout - exit user nquit - exit this systemn");/設(shè)置文件路徑void pathset()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.iparent != m) n = inode_arrayn.iparent; strcat(

42、path,"/"); 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.iparen

43、t;else 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)&& !strcmp(inode_arrayi.user_name,user.user_name) break; if(i = INODENUM) printf("This dir

44、ectory isn't exsited.n"); else inum_cur = 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) &a

45、mp;& (inode_arrayi.iparent = inum_cur)&& !strcmp(inode_arrayi.user_name,user.user_name) if(inode_arrayi.type = 'd') dcount+; printf("%-20s<DIR>n", inode_arrayi.file_name); else fcount+; bcount+=inode_arrayi.length; printf("%-20s%12d bytesn", inode_arrayi

46、.file_name,inode_arrayi.length); printf("n %d file(s)%11d bytesn",fcount,bcount);printf(" %d dir(s) %11d bytes FreeSpacen",dcount,1024*1024-bcount);/ 功能: 在當(dāng)前目錄下創(chuàng)建子目錄(mkdir dir1)void mkdir(void)int i;if(argc != 2)printf("command mkdir must have two args. n");return ;/ 遍歷

47、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_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 file)void create(void)int i;if(argc != 2) printf("command creat must have two args. n"); return ;for(i = 0;

溫馨提示

  • 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. 人人文庫(kù)網(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)論