




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第三章簡單文件系統(tǒng)的實現(xiàn)3.1設計目的和內(nèi)容要求1. 設計目的通過具體的文件存儲空間的管理、文件的物理結(jié)構(gòu)、fi錄結(jié)構(gòu)和文件操作的實現(xiàn),加深 對文件系統(tǒng)內(nèi)部數(shù)據(jù)結(jié)構(gòu)、功能以及實現(xiàn)過程的理解。2. 內(nèi)容要求(1) 在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲分區(qū),在其上實現(xiàn)一個簡單的基于多 級目錄的單用戶單任務系統(tǒng)中的文件系統(tǒng)。在退出該文件系統(tǒng)的使用時,應將該虛擬文件系 統(tǒng)以一個windows文件的方式保存到磁盤上,以便下次可以再將它恢復到內(nèi)存的虛擬磁盤 空間中。(2) 文件存儲空間的分配可采用顯式鏈接分配或其他的辦法。(3) 空閑磁盤空間的管理可選擇位示圖或其他的辦法。如果采用位示圖來管理文件存儲
2、 空間,并采用顯式鏈接分配方式,那么町以將位示圖合并到fat中。(4) 文件目錄結(jié)構(gòu)采用多級目錄結(jié)構(gòu)。為了簡單起見,可以不使用索引結(jié)點,其中的每 個目錄項應包含文件名、物理地址、長度等信息,還可以通過目錄項實現(xiàn)對文件的讀和寫的 保護。(5) 要求提供以下操作命令: my.format:對文件存儲器進行格式化,即按照文件系統(tǒng)的結(jié)構(gòu)對虛擬磁盤空 間進行布局,并在其上創(chuàng)建根冃錄以及用于管理文件存儲空間等的數(shù)據(jù)結(jié)構(gòu)。 my_mkdir:用于創(chuàng)建子目錄。 my_rmdir:用于刪除子目錄。 my_ls:用于顯示忖錄中的內(nèi)容。 my_cd:用于更改當前目錄。 my_create:用于創(chuàng)建文件。 my_op
3、en:用于打開文件。 my_close:用于關閉文件。 my_write:用于寫文件。 my_read:用于讀文件。 my_rm:用于刪除文件。 my_exitsys:用于退出文件系統(tǒng)。3. 學時安排授課2學時,上機9學吋。4. 開發(fā)平臺c或c+均可。5 思考(1)我們的數(shù)據(jù)結(jié)構(gòu)中的文件物理地址信息是使用c語言的指針類型、還是整型,為什 么?(2)如果引入磁盤索引結(jié)點,上述實現(xiàn)過程需要作哪些修改?(3)如果設計的是一個單用戶多任務文件系統(tǒng),則系統(tǒng)需要進行哪些擴充(尤其要考慮 讀寫指針問題)?如果設計的是一個多用戶文件系統(tǒng),則又要進行哪些擴充?3.2預備知識3 2 1 fwt文件系統(tǒng)介紹1概述f
4、at文件系統(tǒng)是微軟公司在其早期的操作系統(tǒng)ms-dos及windows9x屮采用的文件系統(tǒng), 它被設計用來管理小容量的磁盤空間。fat文件系統(tǒng)是以他的文件組織方式文件分配表 (file allocation table, fat)命名的,文件分配表的每個表項中存放某文件的下一個盤塊號, 而該文件的起始盤塊號則保存在它的文件控制塊fcb中。在文件分配表中,一般用ffff來 標識文件的結(jié)束;用0000來標識某個邏輯塊未被分配,即是空閑塊。為了提高文件系統(tǒng)的 可靠性,在邏輯磁盤上通常設置兩張文件分配表,它們互為備份。此外,文件分配表必須存 放在邏輯磁盤上的固定位置,而根冃錄區(qū)通常位于fat2z后,以便
5、操作系統(tǒng)在啟動時能夠 定位所需的文件,其磁盤布局如圖3-1所示:引導塊fa1 1ea12:根目錄區(qū)數(shù)據(jù)區(qū)圖fat文件系統(tǒng)磁盤布局上述磁盤布局中,引導塊中主要存放了用于描述分區(qū)的各種信息,包括邏輯塊的大小、 文件分配表的大小及位置、根冃錄的大小及位置等。除此z外,用于加載操作系統(tǒng)內(nèi)核的引 導程序也存儲在引導塊中。fat文件系統(tǒng)家族乂分為fat12、fat16、fat32三種類型,這里的數(shù)字表示文件分配表 中每個表項(即簇號)所占的位數(shù),即fat12中每個表項占1.5個字節(jié)(12位),fat16中 每個表項占2個字節(jié)(16位),fat32中每個表項占4個字節(jié)(32位)。由于fat文件系統(tǒng) 是以簇為
6、單位為文件分配磁盤空間的(一個簇是一組連續(xù)的扇區(qū),通常包含2"個扇區(qū)),因 此,fat32比fat12和fat16支持更多的簇數(shù)、更小的簇大小和更人的磁盤容量,從而大大 提高磁盤空間的利用率。通常,fat12適用于小容量磁盤,如軟盤;fat16是ms-dos的文 件系統(tǒng);fat32是windows9x '|«的主要文件系統(tǒng),開始支持人容量磁盤。2.文件控制塊fcb為了正確、方便地操作文件,必須設置相應的數(shù)據(jù)結(jié)構(gòu)用于存放文件的描述和控制信 息,常用的數(shù)據(jù)結(jié)構(gòu)有文件控制塊(簡稱fcb)和索引節(jié)點(簡稱i節(jié)點)。在fat文件系統(tǒng) 中使用文件控制塊。文件與文件控制塊一一對應
7、,而文件控制塊的有序集合就稱為文件日錄, 即一個文件控制塊就是一個文件冃錄項。雖然不同文件系統(tǒng)的文件控制塊的內(nèi)容和格式不完全相同,但通常都包括以卜三類信息: 基本信息、存取控制信息和使用信息。(1)基本信息。包括文件名、用戶名、文件類型、文件的物理地址、文件長度、文件 的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)等。(2)存取控制信息。一般分別給出文件主、伙伴用戶、一般用戶的存取權限。(3)使用信息。包括文件的建立日期及吋間、上次存収文件的日期及時間、當前的使 用信息等。以ms-dos (使用fat 16文件系統(tǒng))為例,它的每個文件控制塊包括32個字節(jié),其字節(jié) 分配情況如圖3-2所示:字節(jié) sb3b ib 10b 2
8、b 2b 2b 4b文件名擴屣名屬性時向日期首映號人小圖3-2 ms-dos的文件控制塊一 其中屬性字段占一個字節(jié),它的每一位用來表示該文件是否具有某種屬性,如果某一位 的值為1,則表示該文件具冇該屬性。各位所表示的屬性如表3-1所示:表3-1文件屬性對照表位76543210屬性保留保留存檔子目錄卷標系統(tǒng)文件隱藏只讀3. 根目錄區(qū)fat12、fat16的根目錄區(qū)是固定區(qū)域、固定大小的,位于第二個fat之后,如圖所 示,占據(jù)若于連續(xù)扇區(qū),其中fat12 14個扇區(qū),一共224個根冃錄項;而fat16 32 個扇區(qū),最多保存512個目錄項,作為系統(tǒng)區(qū)的一部分。fat32的根目錄是作為文件處理的,
9、采用與子目錄文件相同的管理方式,其位置不是固定的,不過一般情況也是位于第二個fat z后的,其大小可視需婆增加,因此根f1錄下的文件數(shù)f1不再受最多512個的限制。3 2 2幾個c語言庫函數(shù)介紹由于我們的文件系統(tǒng)是建立在內(nèi)存的虛擬磁盤上的,在退出文件系統(tǒng)的時候必須以一個 文件的形式保存到磁盤上;而在啟動文件系統(tǒng)的時候必須從磁盤上將該文件讀入到內(nèi)存的虛 擬磁盤中。下而介紹兒個可能會用到的c庫函數(shù),在使用這些庫函數(shù)之前必須包含頭文件 “stdio.h”。1.打開文件函數(shù)fopen()(1)格式:file *fopen(const char *filename,const char *mode)(2
10、)功能:按照指定打開方式打開指定文件。(3)輸入?yún)?shù)說明:filename:待打開的文件名,如果不存在就創(chuàng)建該文件。mode:文件打開方式,常用的有: "r":為讀而打開文本文件(不存在則出錯)。 -w:為寫而打開文木文件(若不存在則創(chuàng)建該文件;反z,則從文件起始位置寫, 原內(nèi)容將被覆盃)。 "a-:為在文件末尾添加數(shù)據(jù)而打開文木文件。(若不存在則創(chuàng)建該文件;反之,在 原文件末尾追加)。 +”:為讀和寫而打開文本文件。(讀時,從頭開始;在寫數(shù)據(jù)時,新數(shù)據(jù)只覆蓋所 占的空間,其后不變)。 "w+11:首先建立一個新文件,進行寫操作,隨后可以從頭開始讀。(若
11、文件存在, 原內(nèi)容將全部消失)。 ha+":功能與w相同;只是在文件末尾添加新的數(shù)據(jù)后,可以從頭開始讀。另外,上述模式字符串中都可以加一個“b”字符,如rb、wb、ab、rb+、wb+、ab+等 組合,字符“b”表示fopen()函數(shù)打開的文件為二進制文件,而非純文字文件。(4) 輸出:一個指向file類型的指針。2. 關閉文件函數(shù)fclose()(1) 格式:int fclose(file * stream);(2) 功能:用來關閉先前fopen()打開的-個文件。此動作會讓緩沖區(qū)內(nèi)的數(shù)據(jù)寫入文 件中,并釋放系統(tǒng)所提供的文件資源。(3) 輸入?yún)?shù)說明:stream:指向要關閉文件的
12、指針,它是先前執(zhí)行fopen()g數(shù)的返回值。(4) 輸出:若關閉文件成功則返回0;有錯誤發(fā)生吋則返冋eof并把錯誤代碼存到errnoo3. 讀文件函數(shù)fread()(1) 格式:size_t fread( void *buffer, size_t size, size_t count, file *stream );(2) 功能:讀二進制文件到內(nèi)存。(3) 輸入?yún)?shù)說明:buffer:用于存放輸入數(shù)據(jù)的緩沖區(qū)的首地址;stream:使川fopen()打開的文件的指針,用于指示要讀取的文件; size:每個數(shù)據(jù)塊的字節(jié)數(shù);count:要讀入的數(shù)據(jù)塊的個數(shù);size*count:表示要求讀取的字
13、節(jié)數(shù)。(4) 輸出:實際讀収的數(shù)據(jù)塊的個數(shù)。4. 寫文件函數(shù)fwrite()(1) 格式:size_t fwite(c onst void * buffer,size_t size,size_t count,file * stream);(2) 功能:將數(shù)據(jù)寫到二進制文件小。(3) 輸入?yún)?shù)說明:buffer:用于存放輸出數(shù)據(jù)的緩沖區(qū)的首地址;stream:使川fopen()打開的文件的指針,用于指示要寫出的文件; size:每個數(shù)據(jù)塊的字節(jié)數(shù);count:要寫出的數(shù)據(jù)塊的個數(shù);size*count:表示耍求寫出的字符數(shù)。(4) 輸岀:實際寫出的數(shù)據(jù)塊的個數(shù)。5. 判斷文件結(jié)束函數(shù)feof (
14、)(1) 格式:int feof(file * stream)(2) 功能:用來判斷是否已讀取到文件末尾。(3) 輸入?yún)?shù)說明:stream:使用fopen()打開的文件的指針,用于指示耍判斷的文件。(4) 輸出:如果已讀到文件尾則返冋非零值,其他情況返回0。6. 定位文件函數(shù)fseek()(1) 格式:int fseek( file *stream/ long offset, int origin );(2) 功能:移動文件讀寫指針在文件屮的位置。(3) 輸入?yún)?shù)說明:stream:使用fopen()jt開的文件的指針,用于指示要定位讀寫指針的文件;offset:位移量,以字節(jié)為單位; or
15、igin:初始位置,有三個常量:seek_cur:讀寫指針當前位置; seek_set:文件開頭; seek_end:文件末尾。當origin值為seek_cur或seek_end時,參數(shù)offset nj以為負值。3.3實例系統(tǒng)的設計與實現(xiàn)本實例系統(tǒng)是仿照fat16文件系統(tǒng)來設計實現(xiàn)的,但根目錄沒有采用fat16的固定位置、 固定大小的根目錄區(qū),而是以根目錄文件的形式來實現(xiàn)的,這也是目前主流文件系統(tǒng)對根目 錄的處理方式。3 3 1數(shù)據(jù)結(jié)構(gòu)設計1. 需要包含的頭文件(1) #include <stdio.h>(2) #inelude <malloc.h>(3) #ine
16、lude <stringh>(4) #include <time.h>2. 定義的常量(1) #define blocksize 1024磁盤塊大小(2) #define size 1024000 虛擬磁盤空間人小(3) #define end 65535 fat中的文件結(jié)束標志(4) #define freeofat中盤塊空閑標志(5) #define rootblocknum 2根冃錄區(qū)所占盤塊總數(shù)(6) #definemaxopenfile 10最多同時打開文件個數(shù)3. 數(shù)據(jù)結(jié)構(gòu)(1) 文件控制塊fcb川于記錄文件的描述和控制信息,每個文件設置一個fcb,它也是文
17、件的冃錄項的內(nèi)容。 typedef struct fcb/仿照 fat16 設置的char filename8; /文件名char exname;文件擴展名unsigned char attribute;/文件屬性字段:為簡單起見,我們只為文件設置了兩 種屬性:值為0時表示目錄文件,值為1時表示數(shù)據(jù)文件unsigned short time;文件創(chuàng)建時間unsigned short data;/文件創(chuàng)建 u 期unsigned short first;/文件起始盤塊號unsigned long length;/文件長度(字節(jié)數(shù))char free; 表示口錄項是否為空,若值為0,表示空,值為1
18、,表示已分配fcb;(2) 文件分配表fat在本實例中,文件分配表有兩個作用:一是記錄磁盤上毎個文件所占據(jù)的磁盤塊的塊號; 二是記錄磁盤上哪些塊己經(jīng)分配出去了,哪些塊是空閑的,即起到了位示圖的作用。若fat 屮某個表項的值為free,則表示該表項所對應的磁盤塊是空閑的;若某個表項的值為end, 則表示所對應的磁盤塊是某文件的最后一個磁盤塊;若某個表項的值是英他值,則該值表示 某文件的下一個磁盤塊的塊號。為了提高系統(tǒng)的可靠性,木實例中設置了兩張fat表,它們 互為備份,每個fat占據(jù)兩個磁盤塊。typedef struct fatunsigned short id;fat;(3) 用戶打開文件表
19、useropen當打開一個文件時,必須將文件的目錄項屮的所有內(nèi)容全部復制到內(nèi)存屮,同時還要記 錄有關文件操作的動態(tài)信息,如讀寫指針的值等。在木實例屮實現(xiàn)的是一個用于單用戶單任 務系統(tǒng)的文件系統(tǒng),為簡單起見,我們把用戶文件描述符表和內(nèi)存fcb表合在一起,稱為用 戶打開文件表,表項數(shù)口為10,即一個用戶最多可同吋打開10個文件。然后用一個數(shù)組來 描述,則數(shù)組下標即某個打開文件的描述符。另外,我們在用戶打開文件表中還設置了一個 字段“char dir80",用來記錄每個打開文件所在的冃錄名,以方便用戶打開不同冃錄下具 有相同文件名的不同文件。typedef struct useropenc
20、har filename8; /文件名char exname3;/文件擴展名unsigned char attribute;/文件屬性:值為0吋表示目錄文件,值為1時表示數(shù)據(jù)文 件unsigned short time;/文件創(chuàng)建時間unsigned short data;/文件創(chuàng)建 口 期 unsigned short first;/文件起始盤塊號unsigned long length;/文件長度(對數(shù)據(jù)文件是字節(jié)數(shù),對目錄文件可以是目錄項 個數(shù))char free; 表示1=1錄項是否為空,若值為0,表示空,值為1,表示已分配 前面內(nèi)容是文件的fcb中的內(nèi)容。下面設置的dirno和dir
21、off記錄了相應打開文件的冃錄項在父冃錄文件中的位置, 這樣如果該文件的fcb被修改了,則要寫回父目錄文件時比較方便 int dirno; 相應打開文件的冃錄項在父冃錄文件中的盤塊號int diroff; /相應打開文件的fl錄項在父冃錄文件的dirno盤塊中的口錄項序號 char dirmaxopenfile80; /相應打開文件所在的目錄名,這樣方便快速檢查出 指定文件是否已經(jīng)打開int count; /讀寫指針在文件中的位置char fcbstate; /是否修改了文件的fcb的內(nèi)容,如果修改了置為1,否則為0 chartopenfile;/表示該用戶打開表項是否為空,若值為0,表示為空
22、,否則表示已 被某打開文件占據(jù)juserope n;(4) 引導塊blocko在引導塊屮主耍存放邏輯磁盤的相關描述信息,比如磁盤塊人小、磁盤塊數(shù)量、文件分 配表、根目錄區(qū)、數(shù)據(jù)區(qū)在磁盤上的起始位置等。如果是引導盤,還要存放操作系統(tǒng)的引導 信息。木實例是在內(nèi)存的虛擬磁盤中創(chuàng)建一個文件系統(tǒng),因此所包含的內(nèi)容比較少,只冇磁 盤塊人小、磁盤塊數(shù)量、數(shù)據(jù)區(qū)開始位置、根目錄文件開始位置等。typedef struct blocko 引導塊內(nèi)容存儲一些描述信息,如磁盤塊人小、磁盤塊數(shù)量、最多打開文件數(shù)等、char information200;unsigned short root; /根口錄文件的起始盤塊
23、號unsigned char *startblock; /虛擬磁盤上數(shù)據(jù)區(qū)開始位置jblocko;4. 全局變量定義(1) unsigned char *myvhard:指向虛擬磁盤的起始地址(2) useropen openfilelistmaxopenfile:用八打開文件表數(shù)組(3) useropen *ptrcurdir:指向用戶打開文件表中的當前h錄所在打開文件表項的位 置;(4) charcurrentdir80:記錄當前目錄的目錄名(包括目錄的路徑)(5) unsigned char* startp:記錄虛擬磁盤上數(shù)據(jù)區(qū)開始位置5. 虛擬磁盤空間布局由于真正的磁盤操作需要涉及到設
24、備的驅(qū)動程序,所以木實例是在內(nèi)存中屮請一塊空間 作為虛擬磁盤使用,我們的文件系統(tǒng)就建立在這個虛擬磁盤上。虛擬磁盤一共劃分成1000 個磁盤塊,每個塊1024個字節(jié),其布局格式是模仿fat文件系統(tǒng)設計的,其中引導塊占一 個盤塊,兩張fat各占2個盤塊,剩下的空間全部是數(shù)據(jù)區(qū),在対虛擬磁盤進行格式化的時 候,將把數(shù)據(jù)區(qū)第1塊(即虛擬磁盤的第6塊)分配給根目錄文件,如圖3-3所示:塊數(shù)1塊2塊2塊995塊引導塊卜a 11fa12:數(shù)據(jù)區(qū) 圖3-3虛擬磁盤空間布局當然,也可以仿照fat16文件系統(tǒng),設置根h錄區(qū),其位置緊跟第2張fat后而,大小 也是固定的,這個思路相對要簡單一點,請同學們自己去實現(xiàn)。
25、3 a 2實例主要命令及函數(shù)設計1.系統(tǒng)主函數(shù)main()(1) 對應命令:無(2) 命令調(diào)用格式:無(3) 函數(shù)設計格式:void main()(4) 功能:系統(tǒng)主函數(shù)(5) 輸入:無(6) 輸出:無(7) 函數(shù)需完成的工作: 對前面定義的全局變量進行初始化; 調(diào)用startsys()進入文件系統(tǒng); 列出文件系統(tǒng)提供的各項功能及命令調(diào)用格式; 顯示命令行提示符,等待用戶輸入命令; 將用戶輸入的命令保存到一個buf中; 對but «|'的內(nèi)容進行命令解析,并調(diào)川相應的函數(shù)執(zhí)行川戶鍵入的命令; 如果命令不是“my_exitsys”,則命令執(zhí)行完畢后轉(zhuǎn)。2.進入文件系統(tǒng)函數(shù)sta
26、rtsys()(1) 對應命令:無(2) 命令調(diào)用格式:無(3) 函數(shù)設計格式:void startsys()(4) 功能:由main()函數(shù)調(diào)用,進入并初始化我們所建立的文件系統(tǒng),以供用戶使用。(5) 輸入:無(6) 輸出:無。(7) 函數(shù)需完成的工作: 申請?zhí)摂M磁盤空間; 使用c語言的庫函數(shù)fopen()打開myfsys文件:若文件存在,則轉(zhuǎn);若文件不存在, 則創(chuàng)建之,轉(zhuǎn) 使用c語言的庫函數(shù)fread()讀入myfsys文件內(nèi)容到用八空間中的-個緩沖區(qū)中,并 判斷其開始的8個字節(jié)內(nèi)容是否為"10101010"(文件系統(tǒng)魔數(shù)),如果是,則轉(zhuǎn);否則 轉(zhuǎn); 將上述緩沖區(qū)屮的內(nèi)
27、容復制到內(nèi)存中的虛擬磁盤空間屮;轉(zhuǎn) 在屏幕上顯示“myfsys文件系統(tǒng)不存在,現(xiàn)在開始創(chuàng)建文件系統(tǒng)”信息,并調(diào)用 my_format()對中申請到的虛擬磁盤空間進行格式化操作。轉(zhuǎn); 將虛擬磁盤中的內(nèi)容保存到myfsys文件中;轉(zhuǎn) 使用c語言的庫函數(shù)fclose()關閉myfsys文件; 初始化用戶打開文件表,將表項0分配給根h錄文件使用,并填寫根hl錄文件的相 關信息,由于根目錄沒有上級目錄,所以表項中的dirno和diroff分別置為5 (根目錄所在 起始塊號)和0;并將ptrcurdir指針指向該用戶打開文件表項。 將當前口錄設置為根口錄。3磁盤格式化函數(shù)my_format()(1) 對應
28、命令:my_format(2) 命令調(diào)用格式:my_format(3) 函數(shù)設計格式:void my_format()(4) 功能:對虛擬磁盤進行格式化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū))。(5) 輸入:無(6) 輸出:無。(7) 函數(shù)需完成的工作: 將虛擬磁盤第一個塊作為引導塊,開始的8個字節(jié)是文件系統(tǒng)的魔數(shù),記為 “10101010”;在z后寫入文件系統(tǒng)的描述信息,如fat表大小及位置、根冃錄大小及位置、盤塊人小、盤塊數(shù)量、數(shù)據(jù)區(qū)開始位置等信息; 在引導塊后建立兩張完全一樣的fat表,用于記錄文件所占據(jù)的磁盤塊及管理虛擬 磁盤塊的分配,每個fat占據(jù)兩個磁盤塊;對于每個fat中,前
29、面5個塊設置為已分配,后995個塊設置為空閑; 在第二張fat后創(chuàng)建根目錄文件root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第6塊) 分配給根目錄文件,在該磁盤上創(chuàng)建兩個特殊的冃錄項:和“”,其內(nèi)容除了文件名不 同之外,其他字段完全相同。4. 更改當前目錄函數(shù)my_cd()(1) 對應命令:my_cd(2) 命令調(diào)用格式:my_cd dirname(3) 函數(shù)設計格式:void my_cd(char *dirname)(4) 功能:改變當前目錄到指定的名為dirname的目錄。(5) 輸入:dirname:新的當前冃錄的冃錄名;(6) 輸出:無(7) 函數(shù)需完成的工作: 調(diào)用my_open()打開指
30、定目錄名的父目錄文件,并調(diào)用do_read()讀入該父目錄文件 內(nèi)容到內(nèi)存中; 在父忖錄文件中檢查新的當前目錄名是否存在,如果存在則轉(zhuǎn),否則返回,并顯 示出錯信息; 調(diào)用my_close()關閉中打開的父目錄文件; 調(diào)用my_close()關閉原當前h錄文件; 如果新的當前目錄文件沒有打開,則打開該目錄文件;并將ptrcurdir指向該打開文 件表項; 設置當前f1錄為該f1錄。5. 創(chuàng)建子目錄函數(shù)my_mxdir()(1) 對應命令:my_mkdir(2) 命令調(diào)用格式:my_ mkdir dirname(3) 函數(shù)設計格式:void my_mkdir(char *dirname)(4) 功
31、能:在當前目錄下創(chuàng)建名為dirname的子目錄。(5) 輸入:dirname:新建目錄的目錄名。(6) 輸出:無。(7) 函數(shù)需完成的工作: 調(diào)用do_read()讀入當前目錄文件內(nèi)容到內(nèi)存,檢查當前目錄下新建目錄文件是否重 名,若重名則返回,并顯示錯誤信息; 為新建子目錄文件分配一個空閑打開文件表項,如果沒有空閑表項則返回并顯示錯誤信息: 檢查fat是否有空閑的盤塊,如有則為新建目錄文件分配一個盤塊,否則釋放中 分配的打開文件表項,返回,并顯示錯謀信息; 在當両目錄中為新建目錄文件尋找一個空閑的目錄項或為其追加一個新的目錄項; 需修改當前目錄文件的氏度信息,并將當前ii錄文件的用戶打開文件表
32、項中的fcbstate置為 1; 準備好新建目錄文件的fcb的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方式調(diào)用 do_write()將其填寫到對應的空冃錄項中; 在新建目錄文件所分配到的磁盤塊屮建立兩個特殊的目錄項和目錄項, 方法是:首先在用戶空間小準備好內(nèi)容,然后以截斷寫或者覆蓋寫方式調(diào)用do_write()將其 寫到中分配到的磁盤塊中; 返回。6. 刪除子目錄函數(shù)rmdir()(1) 對應命令:my_rmdir(2) 命令調(diào)用格式:my_rmdirdirname(1) 函數(shù)設計格式:void my_rmdir(char *dirname)(2) 功能:在當前目錄下刪除名為dirname的子目錄
33、。(3) 輸入:dirname:欲刪除目錄的目錄名。(4) 輸出:無。(5) 函數(shù)需完成的工作: 調(diào)用do_read()讀入當前冃錄文件內(nèi)容到內(nèi)存,檢查當前h錄下欲刪除冃錄文件是否 存在,若不存在則返回,并顯示錯謀信息; 檢査欲刪除h錄文件是否為空(除了 和外沒冇其他子目錄和文件),可根 據(jù)其目錄項中記錄的文件長度來判斷,若不為空則返回,并顯示錯謀信息; 檢查該目錄文件是否已經(jīng)打開,若已打開則調(diào)用my_close()關閉掉; 回收該h錄文件所占據(jù)的磁盤塊,修改fat; 從當前目錄文件中清空該目錄文件的目錄項,且free字段置為0:以覆蓋寫方式調(diào) 用do_write()來實現(xiàn); 修改當前f1錄文
34、件的用戶打開表項中的長度信息,并將表項中的fcbstate置為1; 返回。7. 顯示目錄函數(shù)my_ls()(1) 對應命令:my_ls(2) 命令調(diào)用格式:my_ls(3) 函數(shù)設計格式:void myjs(void)(4) 功能:顯示當前目錄的內(nèi)容(子目錄和文件信息)。(5) 輸入:無(6) 輸無(7) 函數(shù)需完成的工作: 調(diào)用do_read()讀出當前目錄文件內(nèi)容到內(nèi)存; 將讀出的冃錄文件的信息按照一定的格式顯示到屏幕上; 返回。&創(chuàng)建文件函數(shù)my_create()(1) 對應命令:my_create(2) 命令調(diào)用格式:my_createfilename(3) 函數(shù)設計格式:in
35、t my_create (char *filename)(4) 功能:倉ij建名為filename的新文件。(5) 輸入:filename:新建文件的文件名,能包含路徑。(6) 輸出:若創(chuàng)建成功,返冋該文件的文件描述符(文件打開表中的數(shù)組下標);否則 返回(7) 函數(shù)需完成的工作: 為新文件分配一個空閑打開文件表項,如果沒有空閑表項則返回-1,并顯示錯誤信 息; 若新文件的父目錄文件還沒有打開,貝j調(diào)用my_open()打開;若打開失敗,貝懈放 小為新建文件分配的空閑文件打開表項,返回1,并顯示錯謀信息; 調(diào)用do_read()讀出該父fl錄文件內(nèi)容到內(nèi)存,檢查該f1錄下新文件是否重名,若重
36、名則釋放中分配的打開文件表項,并調(diào)川my_close()關閉中打開的冃錄文件;然后返回 -1,并顯示錯課信息; 檢查fat是否有空閑的盤塊,如有則為新文件分配一個盤塊,否則釋放中分配的 打開文件表項,并調(diào)用my_close()關閉中打開的目錄文件;返回1,并顯示錯誤信息; 在父目錄屮為新文件尋找一個空閑的日錄項或為其追加一個新的目錄項;需修改該 目錄文件的長度信息,并將該目錄文件的用戶打開文件表項中的fcbstate置為1; 準備好新文件的fcb的內(nèi)容,文件的屬性為數(shù)據(jù)文件,長度為0,以覆蓋寫方式調(diào) 用do_write()將其填寫到屮分配到的空目錄項屮; 為新文件填寫中分配到的空閑打開文件表項
37、,fcbstate字段值為0,讀寫指針值為 0; 調(diào)用my_close()關閉中打開的父目錄文件; 將新文件的打開文件表項序號作為其文件描述符返回。9.刪除文件函數(shù)my_rm()(1) 對應命令:my_rm(2) 命令調(diào)用格式:my_rm filename(3) 函數(shù)設計格式:void my_rm(char *filename)(4) 功能:刪除名為filename的文件。(5) 輸入:filename:欲刪除文件的文件名,町能還包含路徑。(6) 輸出:無。(7) 函數(shù)需完成的工作: 若欲刪除文件的父目錄文件還沒有打開,則調(diào)用my_open()打開;若打開失敗,則 返回,并顯示錯誤信息; 調(diào)用
38、do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢杳該目錄下欲刪除文件是否存在, 若不存在則返回,并顯示錯誤信息; 檢查該文件是否已經(jīng)打開,若已打開則關閉掉; 回收該文件所占據(jù)的磁盤塊,修改fat; 從文件的父11錄文件中清空該文件的口錄項,且free字段置為0:以覆蓋寫方式調(diào) 用do_write()來實現(xiàn);; 修改該父目錄文件的用戶打開文件表項中的長度信息,并將該表項屮的fcbstate置 為1; 返回。10. 打開文件函數(shù)my_open()(1) 對應命令:my_open(2 )命令調(diào)用格式:my_open filename(3) 函數(shù)設計格式:int my_open(char *filen
39、ame)(4) 功能:打開當前口錄下名為filename的文件。(5) 輸入:filename:欲打開文件的文件名(6) 輸出:若打開成功,返冋該文件的描述符(在用戶打開文件表屮表項序號);否則 返回(7) 函數(shù)需完成的工作: 檢查該文件是否已經(jīng)打開,若已打開則返回并顯示錯誤信息; 調(diào)用do_read()讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲打開文件是否存在, 若不存在則返回1,并顯示錯誤信息; 檢查用戶打開文件表中是否冇空表項,若冇則為欲打開文件分配一個空表項,若沒 有則返回并顯示錯誤信息; 為該文件填寫空白用戶打開文件表表項內(nèi)容,讀寫指針置為0; 將該文件所分配到的空白用戶打開文件表表
40、項序號(數(shù)組下標)作為文件描述符fd 返回。11. 關閉文件函數(shù)my_close()(1) 對應命令:my_close(2) 命令調(diào)用格式:my_closefd(3) 函數(shù)設計格式:void my_close(int fd)(4) 功能:關閉前面由my_open()打開的文件描述符為fd的文件。(5) 輸入:fd:文件描述符。(6) 輸出:無。(7) 函數(shù)需完成的工作: 檢查fd的冇效性(fd不能超出用戶打開文件表所在數(shù)組的最大下標),如果無效則 返回 檢查用戶打開文件表表項中的fcbstate字段的值,如果為1則需要將該文件的fcb 的內(nèi)容保存到虛擬磁盤上該文件的目錄項屮,方法是:打開該文件
41、的父目錄文件,以覆蓋寫 方式調(diào)用do_write()將欲關閉文件的fcb寫入父目錄文件的相應盤塊中; 回收該文件占據(jù)的用戶打開文件表表項(進行清空操作),并將topenfile字段置為0; 返回。12. 寫文件函數(shù)my_write()(1) 對應命令:my_write(2) 命令調(diào)用格式:my_writefd(3 )函數(shù)設計格式:int my_write(int fd)(4) 功能:將用戶通過鍵盤輸入的內(nèi)容寫到fd所指定的文件屮。磁盤文件的讀寫操作 都必須以完整的數(shù)據(jù)塊為單位進行,在寫操作吋,先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖區(qū)的人小與 磁盤塊的大小相同,然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出
42、時先將一個磁盤塊 屮的內(nèi)容讀到緩沖區(qū)中,然后再傳送到用戶區(qū)。本實例為了簡便起見,沒有設置緩沖區(qū)管理, 只是在讀寫文件時山用八使用malloc()申請一塊空間作為緩沖區(qū),讀寫操作結(jié)朿后使用free() 釋放掉。寫操作常有三種方式:截斷寫、覆蓋寫和追加寫。截斷寫是放棄原來文件的內(nèi)容,重新 寫文件;覆蓋寫是修改文件在當前讀寫指針所指的位宜開始的部分內(nèi)容;追加寫是在原文件 的最后添加新的內(nèi)容。在本實例中,輸入寫文件命令后,系統(tǒng)會出現(xiàn)提示讓用戶選擇其中的 種寫方式,并將隨后鍵盤輸入的內(nèi)容按照所選的方式寫到文件中,鍵盤輸入內(nèi)容通過 ctr+z鍵(或具他設定的鍵)結(jié)束。(5) 輸入:fd: open()函數(shù)
43、的返冋值,文件的描述符;(6) 輸出:實際寫入的字節(jié)數(shù)。(7) 函數(shù)需完成的工作: 檢查fd的有效性(fd不能超出用戶打開文件表所在數(shù)組的最人卜標),如果無效則 返回1,并顯示出錯信息; 提示并等待用戶輸入寫方式:(1:截斷寫;2:覆蓋寫;3:追加寫) 如果用戶要求的寫方式是截斷寫,則釋放文件除第一塊外的其他磁盤空間內(nèi)容(查 找并修改fat表),將內(nèi)存用戶打開文件表項中文件長度修改為0,將讀寫指針置為0并轉(zhuǎn) ;如果用戶耍求的寫方式是追加寫,則修改文件的當前讀寫指針位置到文件的末尾,并轉(zhuǎn) ;如果寫方式是覆蓋寫,則直接轉(zhuǎn); 提示用戶:整個輸入內(nèi)容通過ctr+z鍵(或其他設定的鍵)結(jié)束;用戶可分多次
44、輸 入寫入內(nèi)容,每次用回車結(jié)束; 等待用戶從鍵盤輸入文件內(nèi)容,并將用戶的本次輸入內(nèi)容保存到一臨時變量text 中,要求每次輸入以回車結(jié)束,全部結(jié)束用ctr+z鍵(或其他設定的鍵); 調(diào)用do_write()函數(shù)將通過鍵盤鍵入的內(nèi)容寫到文件屮。 如果do_write()函數(shù)的返回值為非負值,貝ij將實際寫入字節(jié)數(shù)增加do_write()函數(shù)返 回值,否則顯示出錯信息,并轉(zhuǎn); 如果text中最后一個字符不是結(jié)束字符ctr+乙則轉(zhuǎn)繼續(xù)進行寫操作;否則轉(zhuǎn); 如果當前讀寫指針位置大于用戶打開文件表項屮的文件長度,則修改打開文件表項 中的文件長度信息,并將fcbstate置1; 返回實際寫入的字節(jié)數(shù)。13
45、.實際寫文件函數(shù)do_write()(1) 對應命令:無(2) 命令調(diào)用格式:無(3) 函數(shù)設計格式:int my_write(int fd, char *text, int len, char wstyle)(4) 功能:被寫文件函數(shù)my_write()調(diào)用,用來將鍵盤輸入的內(nèi)容寫到相應的文件小 去。(5) 輸入:fd: open()函數(shù)的返回值,文件的描述符;text:指向要寫入的內(nèi)容的指針;len:本次要求寫入字節(jié)數(shù)wstyle:寫方式(6) 輸出:實際寫入的字節(jié)數(shù)。(7) 函數(shù)需完成的工作: 用malloc()申請1024b的內(nèi)存空間作為讀寫磁盤的緩沖區(qū)buf,申請失敗則返回1, 并顯示出錯信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號和塊內(nèi)偏移off,并利用打開文件表表項中的首塊號及 fat表的相關內(nèi)容將邏輯塊塊號轉(zhuǎn)換成對應的磁盤塊塊號blkno;如果找不到對應的磁盤塊, 則需要檢索fat為該邏輯塊分配-新的磁盤塊,并將對應的磁盤塊塊號blkno登記到fat屮, 若分配失敗
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 砌磚抹灰勞務合同
- 事業(yè)單位職工勞動合同
- 廠房建筑施工合同
- 軟件合作開發(fā)協(xié)議書8篇
- 第三單元巖石與土壤 教學設計-2023-2024學年科學四年級下冊教科版
- 第四章第三節(jié) 工業(yè)同步教學設計2023-2024學年八年級上冊地理 人教版
- 格賓加筋土邊坡施工方案
- 二米六鈦金條門施工方案
- 2025新版工程裝修合同8篇
- 專題節(jié)目許可使用協(xié)議范本7篇
- 《服裝品牌策劃》課件
- 近五年陜西中考數(shù)學真題及答案2024
- 美國藥典-USP-561-植物源性物質(zhì)
- 0-3歲嬰幼兒基礎護理知到智慧樹章節(jié)測試課后答案2024年秋杭州師范大學
- 掛靠免責協(xié)議書范本
- 2024-2030年中國新媒體市場前景規(guī)模及發(fā)展趨勢分析報告
- Python金融數(shù)據(jù)分析與挖掘(微課版) 教案全套 黃恒秋
- 《銷售人員的培訓》課件
- 國防動員課件教學課件
- 特殊作業(yè)安全管理監(jiān)護人專項培訓課件
- 自行車被盜案匯報課件
評論
0/150
提交評論