版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計報告小組編號:小組成員:一、課程設(shè)計概述:1、題目:簡單文件系統(tǒng)的實(shí)現(xiàn)2、實(shí)現(xiàn)內(nèi)容(1) 在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲分區(qū),在其上實(shí)現(xiàn)一個簡單的基于多 級目錄的單用戶單任務(wù)系統(tǒng)中的文件系統(tǒng)。在退出該文件系統(tǒng)的使用時,應(yīng)將該虛擬文件 系統(tǒng)以一個 Windows 文件的方式保存到磁盤上,以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁 盤空間中。(2) 文件存儲空間的分配可采用顯式鏈接分配或其他的辦法。(3) 空閑磁盤空間的管理可選擇位示圖或其他的辦法。如果采用位示圖來管理文件存儲 空間,并采用顯式鏈接分配方式,那么可以將位示圖合并到FAT中。(4) 文件目錄結(jié)構(gòu)采用多級目錄結(jié)構(gòu)。
2、為了簡單起見,可以不使用索引結(jié)點(diǎn),其中的每 個目錄項應(yīng)包含文件名、物理地址、長度等信息,還可以通過目錄項實(shí)現(xiàn)對文件的讀和寫 的保護(hù)。(5) 要求提供以下操作命令:my_format :對文件存儲器進(jìn)行格式化, 即按照文件系統(tǒng)的結(jié)構(gòu)對虛擬磁盤空間進(jìn)行布局,并在其上創(chuàng)建根目錄以及用于管理文件存儲空間等的數(shù)據(jù)結(jié)構(gòu)。my_mkdir:用于創(chuàng)建子目錄my_rmdir :用于刪除子目錄。my_ls :用于顯示目錄中的內(nèi)容。 my_cd用于更改當(dāng)前目錄。 my_create :用于創(chuàng)建文件。my_open用于打開文件。my_close :用于關(guān)閉文件。my_write :用于寫文件。my_read:用于讀文
3、件。my_rm用于刪除文件。my_exitsys :用于退出文件系統(tǒng)。二、 設(shè)計思路(主要算法描述、程序流程圖等) :1系統(tǒng)主函數(shù) main()( 1)對應(yīng)命令:無(2)命令調(diào)用格式:無3)函數(shù)設(shè)計格式: void main()4)功能:系統(tǒng)主函數(shù)(5)輸入:無( 6)輸出:無(7)函數(shù)需完成的工作: 對前面定義的全局變量進(jìn)行初始化; 調(diào)用 startsys() 進(jìn)入文件系統(tǒng); 列出文件系統(tǒng)提供的各項功能及命令調(diào)用格式; 顯示命令行提示符,等待用戶輸入命令; 將用戶輸入的命令保存到一個 buf 中; 對 buf 中的內(nèi)容進(jìn)行命令解析,并調(diào)用相應(yīng)的函數(shù)執(zhí)行用戶鍵入的命令; 如果命令不是“ my_
4、exitsys ”,則命令執(zhí)行完畢后轉(zhuǎn)。2. 進(jìn)入文件系統(tǒng)函數(shù) startsys()(1)對應(yīng)命令:無(2)命令調(diào)用格式:無( 3)函數(shù)設(shè)計格式: void startsys()4)功能:由 main() 函數(shù)調(diào)用,進(jìn)入并初始化我們所建立的文件系統(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)容是否為“”(文件系統(tǒng)魔數(shù)),如果是,
5、則轉(zhuǎn);否則轉(zhuǎn); 將上述緩沖區(qū)中的內(nèi)容復(fù)制到內(nèi)存中的虛擬磁盤空間中;轉(zhuǎn) 在屏幕上顯示“ myfsys 文件系統(tǒng)不存在,現(xiàn)在開始創(chuàng)建文件系統(tǒng)”信息,并調(diào)用 my_format()對中申請到的虛擬磁盤空間進(jìn)行格式化操作。轉(zhuǎn); 將虛擬磁盤中的內(nèi)容保存到 myfsys文件中;轉(zhuǎn) 使用 c 語言的庫函數(shù) fclose() 關(guān)閉 myfsys 文件; 初始化用戶打開文件表, 將表項 0 分配給根目錄文件使用, 并填寫根目錄文件的相關(guān)信 息,由于根目錄沒有上級目錄,所以表項中的 dirno 和 diroff 分別置為 5(根目錄所在起 始塊號)和 0;并將 ptrcurdir 指針指向該用戶打開文件表項。 將
6、當(dāng)前目錄設(shè)置為根目錄。3磁盤格式化函數(shù) my_format()1)對應(yīng)命令: my_format( 2)命令調(diào)用格式: my_format( 3)函數(shù)設(shè)計格式: void my_format()( 4)功能:對虛擬磁盤進(jìn)行格式化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū))。(5)輸入:無( 6)輸出:無。(7)函數(shù)需完成的工作: 將虛擬磁盤第一個塊作為引導(dǎo)塊,開始的 8 個字節(jié)是文件系統(tǒng)的魔數(shù),記為“” ;在之 后寫入文件系統(tǒng)的描述信息,如 FAT 表大小及位置、根目錄大小及位置、盤塊大小、盤塊 數(shù)量、數(shù)據(jù)區(qū)開始位置等信息; 在引導(dǎo)塊后建立兩張完全一樣的 FAT 表,用于記錄文件所占據(jù)的磁盤塊
7、及管理虛擬磁盤塊的分配,每個FAT占據(jù)兩個磁盤塊;對于每個 FAT中,前面5個塊設(shè)置為已分配,后面995 個塊設(shè)置為空閑; 在第二張F(tuán)AT后創(chuàng)建根目錄文件root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第6塊)分 配給根目錄文件,在該磁盤上創(chuàng)建兩個特殊的目錄項: “. ”和“. ”,其內(nèi)容除了文件名不 同之外,其他字段完全相同。4更改當(dāng)前目錄函數(shù) my_cd()1 )對應(yīng)命令: my_cd2)命令調(diào)用格式: my_cd dirname( 3)函數(shù)設(shè)計格式: void my_cd(char *dirname)( 4)功能:改變當(dāng)前目錄到指定的名為 dirname 的目錄。(5)輸入:dirname :新
8、的當(dāng)前目錄的目錄名;( 6)輸出:無(7)函數(shù)需完成的工作: 調(diào)用 my_open() 打開指定目錄名的父目錄文件,并調(diào)用 do_read() 讀入該父目錄文件內(nèi) 容到內(nèi)存中; 在父目錄文件中檢查新的當(dāng)前目錄名是否存在, 如果存在則轉(zhuǎn), 否則返回, 并顯示出 錯信息; 調(diào)用 my_close() 關(guān)閉中打開的父目錄文件; 調(diào)用 my_close() 關(guān)閉原當(dāng)前目錄文件; 如果新的當(dāng)前目錄文件沒有打開, 則打開該目錄文件; 并將 ptrcurdir 指向該打開文件 表項; 設(shè)置當(dāng)前目錄為該目錄。5創(chuàng)建子目錄函數(shù) my_mkdir()1)對應(yīng)命令: my_mkdir( 2)命令調(diào)用格式: my_
9、mkdir dirname( 3)函數(shù)設(shè)計格式: void my_mkdir(char *dirname)( 4)功能:在當(dāng)前目錄下創(chuàng)建名為 dirname 的子目錄。(5)輸入:dirname :新建目錄的目錄名。( 6)輸出:無。(7)函數(shù)需完成的工作: 調(diào)用 do_read() 讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下新建目錄文件是否重 名,若重名則返回,并顯示錯誤信息; 為新建子目錄文件分配一個空閑打開文件表項, 如果沒有空閑表項則返回 -1 ,并顯示錯 誤信息; 檢查 FAT 是否有空閑的盤塊, 如有則為新建目錄文件分配一個盤塊, 否則釋放中分配 的打開文件表項,返回,并顯示錯誤信
10、息; 在當(dāng)前目錄中為新建目錄文件尋找一個空閑的目錄項或為其追加一個新的目錄項 ; 需修 改當(dāng)前目錄文件的長度信息, 并將當(dāng)前目錄文件的用戶打開文件表項中的 fcbstate 置為 1; 準(zhǔn)備好新建目錄文件的 FCB 的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方式調(diào)用 do_write() 將其填寫到對應(yīng)的空目錄項中; 在新建目錄文件所分配到的磁盤塊中建立兩個特殊的目錄項“ . ”和“ . ”目錄項,方 法是:首先在用戶空間中準(zhǔn)備好內(nèi)容,然后以截斷寫或者覆蓋寫方式調(diào)用 do_write() 將其 寫到中分配到的磁盤塊中; 返回。6刪除子目錄函數(shù) rmdir()( 1)對應(yīng)命令: my_ rmdir(
11、 2)命令調(diào)用格式: my_ rmdir dirname( 1)函數(shù)設(shè)計格式: void my_rmdir(char *dirname)( 2)功能:在當(dāng)前目錄下刪除名為 dirname 的子目錄。(3)輸入:dirname :欲刪除目錄的目錄名。(4)輸出:無。(5)函數(shù)需完成的工作: 調(diào)用 do_read() 讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存, 檢查當(dāng)前目錄下欲刪除目錄文件是否存 在,若不存在則返回,并顯示錯誤信息; 檢查欲刪除目錄文件是否為空(除了“ . ”和“ . ”外沒有其他子目錄和文件) ,可根據(jù) 其目錄項中記錄的文件長度來判斷,若不為空則返回,并顯示錯誤信息; 檢查該目錄文件是否已經(jīng)打
12、開,若已打開則調(diào)用 my_close() 關(guān)閉掉; 回收該目錄文件所占據(jù)的磁盤塊,修改 FAT;0:以覆蓋寫方式調(diào)用fcbstate 置為 1; 從當(dāng)前目錄文件中清空該目錄文件的目錄項,且 free 字段置為 do_write() 來實(shí)現(xiàn); 修改當(dāng)前目錄文件的用戶打開表項中的長度信息,并將表項中的 返回。7顯示目錄函數(shù) my_ls()( 1)對應(yīng)命令: my_ls( 2)命令調(diào)用格式: my_ls( 3)函數(shù)設(shè)計格式: void my_ls(void)( 4)功能:顯示當(dāng)前目錄的內(nèi)容(子目錄和文件信息) 。(5)輸入:無( 6)輸出:無(7)函數(shù)需完成的工作: 調(diào)用 do_read() 讀出當(dāng)
13、前目錄文件內(nèi)容到內(nèi)存; 將讀出的目錄文件的信息按照一定的格式顯示到屏幕上; 返回。8創(chuàng)建文件函數(shù) my_create()1)對應(yīng)命令: my_create( 2)命令調(diào)用格式: my_create filename( 3)函數(shù)設(shè)計格式: int my_create (char *filename)( 4)功能:創(chuàng)建名為 filename 的新文件。(5)輸入:filename :新建文件的文件名,可能包含路徑。( 6)輸出:若創(chuàng)建成功,返回該文件的文件描述符(文件打開表中的數(shù)組下標(biāo));否則返回-1。(7)函數(shù)需完成的工作: 為新文件分配一個空閑打開文件表項,如果沒有空閑表項則返回 -1 ,并顯
14、示錯誤信息; 若新文件的父目錄文件還沒有打開,則調(diào)用my_open()打開;若打開失敗,則釋放中為新建文件分配的空閑文件打開表項,返回 -1 ,并顯示錯誤信息; 調(diào)用 do_read() 讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下新文件是否重名,若重名 則釋放中分配的打開文件表項,并調(diào)用 my_close()關(guān)閉中打開的目錄文件;然后返回 -1 ,并顯示錯誤信息; 檢查FAT是否有空閑的盤塊,如有則為新文件分配一個盤塊,否則釋放中分配的打開 文件表項,并調(diào)用my_close()關(guān)閉中打開的目錄文件;返回-1,并顯示錯誤信息; 在父目錄中為新文件尋找一個空閑的目錄項或為其追加一個新的目錄項 ;需修
15、改該目錄 文件的長度信息,并將該目錄文件的用戶打開文件表項中的 fcbstate 置為 1; 準(zhǔn)備好新文件的 FCB 的內(nèi)容,文件的屬性為數(shù)據(jù)文件,長度為0,以覆蓋寫方式調(diào)用do_write() 將其填寫到中分配到的空目錄項中; 為新文件填寫中分配到的空閑打開文件表項, fcbstate 字段值為 0,讀寫指針值為 0 ; 調(diào)用 my_close() 關(guān)閉中打開的父目錄文件; 將新文件的打開文件表項序號作為其文件描述符返回。9刪除文件函數(shù) my_rm()( 1)對應(yīng)命令: my_rm( 2)命令調(diào)用格式: my_rm filename( 3)函數(shù)設(shè)計格式: void my_rm(char *f
16、ilename)( 4)功能:刪除名為 filename 的文件。(5)輸入:filename :欲刪除文件的文件名,可能還包含路徑。( 6)輸出:無。(7)函數(shù)需完成的工作: 若欲刪除文件的父目錄文件還沒有打開,貝U調(diào)用my_open()打開;若打開失敗,貝U返回, 并顯示錯誤信息; 調(diào)用 do_read() 讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下欲刪除文件是否存在,若 不存在則返回,并顯示錯誤信息; 檢查該文件是否已經(jīng)打開,若已打開則關(guān)閉掉; 回收該文件所占據(jù)的磁盤塊,修改 FAT; 從文件的父目錄文件中清空該文件的目錄項,且 free 字段置為 0 :以覆蓋寫方式調(diào)用 do_write
17、() 來實(shí)現(xiàn); 修改該父目錄文件的用戶打開文件表項中的長度信息,并將該表項中的 fcbstate 置為 1; 返回。10打開文件函數(shù) my_open()( 1)對應(yīng)命令: my_open( 2)命令調(diào)用格式: my_open filename( 3)函數(shù)設(shè)計格式: int my_open(char *filename)( 4)功能:打開當(dāng)前目錄下名為 filename 的文件。(5)輸入:filename :欲打開文件的文件名( 6)輸出:若打開成功,返回該文件的描述符(在用戶打開文件表中表項序號);否則返回-1。(7)函數(shù)需完成的工作: 檢查該文件是否已經(jīng)打開,若已打開則返回 -1 ,并顯示
18、錯誤信息; 調(diào)用 do_read() 讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲打開文件是否存在,若 不存在則返回 -1 ,并顯示錯誤信息; 檢查用戶打開文件表中是否有空表項, 若有則為欲打開文件分配一個空表項, 若沒有則 返回-1 ,并顯示錯誤信息; 為該文件填寫空白用戶打開文件表表項內(nèi)容,讀寫指針置為0; 將該文件所分配到的空白用戶打開文件表表項序號(數(shù)組下標(biāo))作為文件描述符 fd 返 回。11關(guān)閉文件函數(shù) my_close()( 1)對應(yīng)命令: my_close( 2)命令調(diào)用格式: my_close fd( 3)函數(shù)設(shè)計格式: void my_close(int fd)(4)功能:關(guān)閉
19、前面由my_open()打開的文件描述符為fd的文件。( 5)輸入:fd :文件描述符。6)輸出:無(7)函數(shù)需完成的工作: 檢查 fd 的有效性( fd 不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)) ,如果無效則返 回-1; 檢查用戶打開文件表表項中的fcbstate字段的值,如果為1則需要將該文件的FCB的 內(nèi)容保存到虛擬磁盤上該文件的目錄項中,方法是:打開該文件的父目錄文件,以覆蓋寫方式調(diào)用do_write()將欲關(guān)閉文件的FCB寫入父目錄文件的相應(yīng)盤塊中; 回收該文件占據(jù)的用戶打開文件表表項(進(jìn)行清空操作) ,并將 topenfile 字段置為 0; 返回。12寫文件函數(shù) my_writ
20、e()(1)對應(yīng)命令: my_write(2)命令調(diào)用格式: my_write fd( 3)函數(shù)設(shè)計格式: int my_write(int fd)(4)功能:將用戶通過鍵盤輸入的內(nèi)容寫到fd 所指定的文件中。磁盤文件的讀寫操作都必須以完整的數(shù)據(jù)塊為單位進(jìn)行,在寫操作時,先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖區(qū)的大小與 磁盤塊的大小相同,然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出時先將一個磁盤 塊中的內(nèi)容讀到緩沖區(qū)中,然后再傳送到用戶區(qū)。本實(shí)例為了簡便起見,沒有設(shè)置緩沖區(qū) 管理,只是在讀寫文件時由用戶使用 malloc() 申請一塊空間作為緩沖區(qū),讀寫操作結(jié)束后 使用 free() 釋放掉。寫操作常有
21、三種方式:截斷寫、覆蓋寫和追加寫。截斷寫是放棄原來文件的內(nèi)容,重新寫 文件;覆蓋寫是修改文件在當(dāng)前讀寫指針?biāo)傅奈恢瞄_始的部分內(nèi)容;追加寫是在原文件的最后添加新的內(nèi)容。在本實(shí)例中,輸入寫文件命令后,系統(tǒng)會出現(xiàn)提示讓用戶選擇其中的一種寫方式,并將隨后鍵盤輸入的內(nèi)容按照所選的方式寫到文件中,鍵盤輸入內(nèi)容通過CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束。(5)輸入:fd : open() 函數(shù)的返回值,文件的描述符;( 6)輸出:實(shí)際寫入的字節(jié)數(shù)。( 7)函數(shù)需完成的工作: 檢查 fd 的有效性( fd 不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)) ,如果無效則返回-1 ,并顯示出錯信息; 提示并等待用戶輸入寫
22、方式: ( 1 :截斷寫; 2 :覆蓋寫; 3 :追加寫) 如果用戶要求的寫方式是截斷寫, 則釋放文件除第一塊外的其他磁盤空間內(nèi)容 (查找并修改FAT表),將內(nèi)存用戶打開文件表項中文件長度修改為 0,將讀寫指針置為0并轉(zhuǎn); 如果用戶要求的寫方式是追加寫, 則修改文件的當(dāng)前讀寫指針位置到文件的末尾, 并轉(zhuǎn); 如果寫方式是覆蓋寫,則直接轉(zhuǎn); 提示用戶:整個輸入內(nèi)容通過 CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束;用戶可分多次輸入寫 入內(nèi)容,每次用回車結(jié)束; 等待用戶從鍵盤輸入文件內(nèi)容, 并將用戶的本次輸入內(nèi)容保存到一臨時變量 text 中, 要求每次輸入以回車結(jié)束,全部結(jié)束用 CTR+Z鍵(或其他設(shè)定的鍵
23、); 調(diào)用 do_write() 函數(shù)將通過鍵盤鍵入的內(nèi)容寫到文件中 如果 do_write() 函數(shù)的返回值為非負(fù)值,則將實(shí)際寫入字節(jié)數(shù)增加 do_write() 函數(shù)返 回值,否則顯示出錯信息,并轉(zhuǎn); 如果text中最后一個字符不是結(jié)束字符 CTR+Z則轉(zhuǎn)繼續(xù)進(jìn)行寫操作;否則轉(zhuǎn); 如果當(dāng)前讀寫指針位置大于用戶打開文件表項中的文件長度, 則修改打開文件表項中的 文件長度信息,并將 fcbstate 置 1; 返回實(shí)際寫入的字節(jié)數(shù)。13實(shí)際寫文件函數(shù) do_write()(1) 對應(yīng)命令:無(2) 命令調(diào)用格式:無( 3)函數(shù)設(shè)計格式: int my_write(int fd, char *t
24、ext , int len , char wstyle)(4) 功能:被寫文件函數(shù) my_write() 調(diào)用,用來將鍵盤輸入的內(nèi)容寫到相應(yīng)的文件中去。(5) 輸入:fd : open() 函數(shù)的返回值,文件的描述符;text :指向要寫入的內(nèi)容的指針;len :本次要求寫入字節(jié)數(shù)wstyle :寫方式6)輸出:實(shí)際寫入的字節(jié)數(shù)(7)函數(shù)需完成的工作: 用malloc()申請1024B的內(nèi)存空間作為讀寫磁盤的緩沖區(qū) buf,申請失敗則返回-1 ,并 顯示出錯信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號和塊內(nèi)偏移 off ,并利用打開文件表表項中的首塊號及FAT表的相關(guān)內(nèi)容將邏輯塊塊號轉(zhuǎn)換成對應(yīng)的磁盤塊塊
25、號blkno ;如果找不到對應(yīng)的磁盤塊,則需要檢索FAT為該邏輯塊分配一新的磁盤塊,并將對應(yīng)的磁盤塊塊號blkno登記到FAT中,若分配失敗,則返回-1,并顯示出錯信息; 如果是覆蓋寫,或者如果當(dāng)前讀寫指針?biāo)鶎?yīng)的塊內(nèi)偏移 off 不等于 0,則將塊號為 blkno的虛擬磁盤塊全部1024B的內(nèi)容讀到緩沖區(qū)buf中;否則便用ASCII碼0清空buf ; 將 text 中未寫入的內(nèi)容暫存到緩沖區(qū) buff 的第 off 字節(jié)開始的位置,直到緩沖區(qū)滿, 或者接收到結(jié)束字符CTR+Z為止;將本次寫入字節(jié)數(shù)記錄到tmplen中; 將buf中1024B的內(nèi)容寫入到塊號為blkno的虛擬磁盤塊中; 將當(dāng)前
26、讀寫指針修改為原來的值加上 tmplen ;并將本次實(shí)際寫入的字節(jié)數(shù)增加 tmplen ; 如果tmplen小于len,則轉(zhuǎn)繼續(xù)寫入;否則轉(zhuǎn); 返回本次實(shí)際寫入的字節(jié)數(shù)。14讀文件函數(shù) my_read()1) 對應(yīng)命令: my_read2)命令調(diào)用格式: my_read fd len( 3)函數(shù)設(shè)計格式: int myread (int fd, int len)( 4)功能:讀出指定文件中從讀寫指針開始的長度為len 的內(nèi)容到用戶空間中。(5)輸入:fd : open() 函數(shù)的返回值,文件的描述符;len: 要從文件中讀出的字節(jié)數(shù)。(6)輸出:實(shí)際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 定義
27、一個字符型數(shù)組 textlen ,用來接收用戶從文件中讀出的文件內(nèi)容; 檢查 fd 的有效性( fd 不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)) ,如果無效則返 回-1 ,并顯示出錯信息; 調(diào)用 do_read() 將指定文件中的 len 字節(jié)內(nèi)容讀出到 text 中; 如果 do_read() 的返回值為負(fù),則顯示出錯信息; 否則將 text 中的內(nèi)容顯示到屏幕上; 返回。15實(shí)際讀文件函數(shù) do_read()(1)對應(yīng)命令:無2)命令調(diào)用格式:無3) 函數(shù)設(shè)計格式: int do_read (int fd, int len,char *text)( 4)功能:被 my_read() 調(diào)用,
28、讀出指定文件中從讀寫指針開始的長度為len 的內(nèi)容到用戶空間的 text 中。(5)輸入:fd : open() 函數(shù)的返回值,文件的描述符;len: 要求從文件中讀出的字節(jié)數(shù)。text :指向存放讀出數(shù)據(jù)的用戶區(qū)地址(6)輸出:實(shí)際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 使用malloc()申請1024B空間作為緩沖區(qū)buf,申請失敗則返回-1,并顯示出錯信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號及塊內(nèi)偏移量 off ,利用打開文件表表項中的首塊號查找FAT表,找到該邏輯塊所在的磁盤塊塊號;將該磁盤塊塊號轉(zhuǎn)化為虛擬磁盤上的內(nèi)存位置; 將該內(nèi)存位置開始的1024B(一個磁盤塊)內(nèi)容讀入buf中; 比較
29、buf中從偏移量off開始的剩余字節(jié)數(shù)是否大于等于應(yīng)讀寫的字節(jié)數(shù) len,如果是, 則將從 off 開始的 buf 中的 len 長度的內(nèi)容讀入到 text 中;否則,將從 off 開始的 buf 中的剩余內(nèi)容讀入到 text 中; 將讀寫指針增加中已讀字節(jié)數(shù),將應(yīng)讀寫的字節(jié)數(shù)len減去中已讀字節(jié)數(shù),若len大于0,則轉(zhuǎn);否則轉(zhuǎn); 使用free()釋放中申請的buf 返回實(shí)際讀出的字節(jié)數(shù)。16.退出文件系統(tǒng)函數(shù)my_exitsys()(1) 對應(yīng)命令:my_exitsys(2) 命令調(diào)用格式:my_ exitsys(1) 函數(shù)設(shè)計格式:void my_exitsys()(2) 功能:退出文件系
30、統(tǒng)。(3) 輸入:無(4) 輸出:無。(5) 函數(shù)需完成的工作: 使用C庫函數(shù)fopen()打開磁盤上的myfsys文件; 將虛擬磁盤空間中的所有內(nèi)容保存到磁盤上的myfsys文件中; 使用c語言的庫函數(shù)fclose()關(guān)閉myfsys文件; 撤銷用戶打開文件表,釋放其內(nèi)存空間 釋放虛擬磁盤空間。流程圖程序啟動文件系加載文件系統(tǒng)是 *否創(chuàng)建文件系統(tǒng),并格式化等待用戶命令輸入-y lmy crea用戶|輸m/ ovif o/my_rmmy open入命令I(lǐng)lly t! XJ 1 3 Y三、程序?qū)崿F(xiàn)代碼:#in elude #in elude #i nclude #in elude #defi n
31、e BLOCKSIZE 1024 /磁盤塊大小#defi ne SIZE 1024000 /虛擬磁盤空間大小#define END 65535 / FAT 中的文件結(jié)束標(biāo)志#define FREE 0 / FAT 中盤塊空閑標(biāo)志#define ROOTBLOCKNUM 2 / 根目錄區(qū)所占盤塊數(shù)#define MAXOPENFILE 10/ 最多同時打開文件個數(shù) t#define MAXTEXT 10000 /* 文件控制塊 */typedef struct FCBchar filename8; /文件名char exname3; /文件擴(kuò)展名unsigned char attribute;/
32、文件屬性字段,值為 0 時表示目錄文件,值為 1時表示數(shù)據(jù)文件unsigned short time; /文件創(chuàng)建時間unsigned short date; /文件創(chuàng)建日期unsigned short first; /文件起始盤塊號unsigned long length; /文件長度char free; /表示目錄項是否為空,若值為 0,表示空,值為 1,表示已分配fcb;/* 文件分配表 */ typedef struct FATunsigned short id; / 磁盤塊的狀態(tài)(空閑的,最后的,下一個)fat;/* 用戶打開文件表 */unsignedtypedef struct
33、USEROPENchar filename8; /文件名char exname3; /文件擴(kuò)展名unsigned char attribute;/文件屬性字段,值為 0 時表示目錄文件,值為 1時表示數(shù)據(jù)文件unsigned short time; /文件創(chuàng)建時間unsigned short date; /文件創(chuàng)建日期unsigned short first; /文件起始盤塊號long length;/ 文件長度(對數(shù)據(jù)文件是字節(jié)數(shù),對目錄文件可以是目錄項個數(shù))char free; /表示目錄項是否為空,若值為 0,表示空,值為 1,表示已分配unsigned short dirno; /相應(yīng)
34、打開文件的目錄項在父目錄文件中的盤塊號int diroff; /相應(yīng)打開文件的目錄項在父目錄文件的 dirno 盤塊中的目錄項序號char dir80; /相應(yīng)打開文件所在的路徑名,這樣方便快速檢查出指定文件是否已經(jīng)打開int father; /父目錄在打開文件表項的位置int count; /讀寫指針在文件中的位置 , 文件的總字符數(shù)char fcbstate; /是否修改了文件的FCB的內(nèi)容,如果修改了置為1,否則為0char topenfile; /表示該用戶打開表項是否為空,若值為 0,表示為空,否則表示已被某打開文件占據(jù)useropen;/* 引導(dǎo)塊 */typedef struct
35、 BLOCK0char magic10; /文件系統(tǒng)魔數(shù)char information200;/ 存儲一些描述信息,如磁盤塊大小、磁盤塊數(shù)量、最多打開文件數(shù)等unsigned short root; /根目錄文件的起始盤塊號unsigned char *startblock; / 虛擬磁盤上數(shù)據(jù)區(qū)開始位置 block0;unsigned char *myvhard; / 指向虛擬磁盤的起始地址useropen openfilelistMAXOPENFILE; / 用戶打開文件表數(shù)組int curdir; /用戶打開文件表中的當(dāng)前目錄所在打開文件表項的位置char currentdir80;
36、/ 記錄當(dāng)前目錄的目錄名(包括目錄的路徑)unsigned char* startp; /記錄虛擬磁盤上數(shù)據(jù)區(qū)開始位置char myfilename= myfilesys;/文件系統(tǒng)的文件名void startsys(); /進(jìn)入文件系統(tǒng)void my_format(); / 磁盤格式化void my_cd(char *dirname); / 更改當(dāng)前目錄void my_mkdir(char *dirname); /創(chuàng)建子目錄void my_ls(); /顯示目錄創(chuàng)建文件void my_rmdir(char *dirname); /刪除子目錄void my_create (char *file
37、name); /int my_open(char *filename); / 打開文件int my_close(int fd); /關(guān)閉文件實(shí)際寫文件int my_write(int fd); /寫文件int do_write(int fd, char *text, int len, char wstyle); /int my_read (int fd, int len); /讀文件int do_read (int fd, int len,char *text); / 實(shí)際讀文件void my_exitsys(); / 退出文件系統(tǒng)unsigned short findblock(); / 尋
38、找空閑盤塊int findopenfile(); / 尋找空閑文件表項void startsys()FILE *fp;unsigned char bufSIZE;fcb *root;int i;申請?zhí)摂M磁盤空間myvhard = (unsigned char *)malloc(SIZE);/ memset(myvhard, 0, SIZE);/ 將 myvhard 中前 SIZE 個字節(jié)用 0 替換并返回 myvhard if(fp = fopen(myfilename, r) != NULL)fread(buf, SIZE, 1, fp);/ 將二進(jìn)制文件讀取到緩沖區(qū)fclose(fp);p
39、rintf(myfilesys is not exist,begin to creat the file.n);my_format();elsefor(i = 0; i filename);strcpy(openfilelist0.exname, root-exname);openfilelist0.attribute = root-attribute;openfilelist0.time = root-time;openfilelist0.date = root-date;openfilelist0.first = root-first;openfilelist0.length = root
40、-length;openfilelist0.free = root-free;openfilelist0.dirno = 5;openfilelist0.diroff = 0;strcpy(openfilelist0.dir, root);openfilelist0.father = 0;openfilelist0.count = 0;openfilelist0.fcbstate = 0;openfilelist0.topenfile = 1;for(i = 1; i startblock;void my_format()FILE *fp;fat *fat1, *fat2;block0 *bl
41、k0;time_t now;struct tm *nowtime;fcb *root;int i;blk0 = (block0 *)myvhard;fat1 = (fat *)(myvhard + BLOCKSIZE);fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(blk0-information, My FileSystem Ver 1.0 n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2n
42、);blk0-root = 5;blk0-startblock = (unsigned char *)root;for(i = 0; i id = END;fat2-id = END;fat2+;fat1-id = 6;fat2-id = 6;fat1+;fat2+;fat1-id = END;fat2-id = END;fat1+;fat2+;for(i = 7; i id = FREE;fat2-id = FREE;fat1+;fat2+;now = time(NULL);nowtime = localtime(&now);strcpy(root-filename, .);strcpy(r
43、oot-exname, );root-attribute = 0x28;root-time = nowtime-tm_hour * 2048 + nowtime-tm_min * 32 + nowtime-tm_sec / 2;root-date = (nowtime-tm_year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtime-tm_mday;root-first = 5;root-length = 2 * sizeof(fcb);root-free = 1;root+;now = time(NULL);strcpy(root-filen
44、ame, .);nowtime = localtime(&now);strcpy(root-exname, );root-attribute = 0x28;root-time = nowtime-tm_hour * 2048 + nowtime-tm_min * 32 + nowtime-tm_sec / 2;root-date = (nowtime-tm_year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtime-tm_mday;root-first = 5;root-length = 2 * sizeof(fcb);root-free =
45、1;fp = fopen(myfilename, w);fwrite(myvhard, SIZE, 1, fp);fclose(fp);void my_cd(char *dirname)char *dir;int fd;符串, 為分隔符字符串if(strcmp(dir, .) = 0)return;else if(strcmp(dir, .) = 0)if(curdir)curdir = my_close(curdir);return;else if(strcmp(dir, root) = 0)while(curdir)curdir = my_close(curdir); dir = strt
46、ok(NULL, );while(dir)dir = strtok(dirname, );/分解字符串為一組字符串。 dirname 為要分解的字fd = my_open(dir);if(fd != -1)curdir = fd;elsereturn;dir = strtok(NULL, );void my_mkdir(char *dirname)fcb *fcbptr;fat *fat1, *fat2;time_t now;struct tm *nowtime;char textMAXTEXT;unsigned short blkno;int rbn, fd, i;fat1 = (fat *
47、)(myvhard + BLOCKSIZE);fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);openfilelistcurdir.count = 0;rbn = do_read(curdir, openfilelistcurdir.length, text);fcbptr = (fcb *)text;for(i = 0; i filename, dirname) = 0 & strcmp(fcbptr-exname, )= 0)printf(Error,the dirname is already exist!n);return;fcbptr = (fcb *
48、)text;for(i = 0; i free = 0)break;fcbptr+;blkno = findblock();/ 尋找空閑盤塊if(blkno = -1)return;(fat1 + blkno)-id = END;(fat2 + blkno)-id = END;now = time(NULL);nowtime = localtime(&now);strcpy(fcbptr-filename, dirname);strcpy(fcbptr-exname, );fcbptr-attribute = 0x30;fcbptr-time = nowtime-tm_hour * 2048
49、+ nowtime-tm_min * 32 + nowtime-tm_sec / 2;fcbptr-date = (nowtime-tm_year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtime-tm_mday;fcbptr-first = blkno;fcbptr-length = 2 * sizeof(fcb);fcbptr-free = 1;openfilelistcurdir.count = i * sizeof(fcb);/把當(dāng)前目錄的文件讀寫指針定位到文件末尾do_write(curdir, (char *)fcbptr, siz
50、eof(fcb), 2);/ 從指針 fcbptr 開始寫一個 fcb 大小的內(nèi)容到當(dāng)前目錄文件末尾fd = my_open(dirname);/ 返回新建立的目錄文件在用戶打開文件數(shù)組的下標(biāo)if(fd = -1)return;fcbptr = (fcb *)malloc(sizeof(fcb);/建立新目錄的 .,.目錄now = time(NULL);nowtime = localtime(&now);strcpy(fcbptr-filename, .);strcpy(fcbptr-exname, );fcbptr-attribute = 0x28;fcbptr-time = nowtim
51、e-tm_hour * 2048 + nowtime-tm_min * 32 nowtime-tm_sec / 2;fcbptr-date = (nowtime-tm_year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtime-tm_mday;fcbptr-first = blkno;fcbptr-length = 2 * sizeof(fcb);fcbptr-free = 1;do_write(fd, (char *)fcbptr, sizeof(fcb), 2);now = time(NULL);nowtime = localtime(&now);strcpy(fcbptr-filename, .);strcpy(fcbptr-exname, );fcbptr-timenowtime-tm_hour2048 + nowtime-tm_min32 +fcbptr-attribute = 0x28;nowtime-tm_sec / 2;fcbptr-date = (nowtime-tm_year - 80) * 512 +
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 制圖紙產(chǎn)品供應(yīng)鏈分析
- 電源控制器市場發(fā)展前景分析及供需格局研究預(yù)測報告
- 蓄電瓶市場分析及投資價值研究報告
- 電子測量設(shè)備項目運(yùn)營指導(dǎo)方案
- 穿孔樂譜紙卷項目運(yùn)營指導(dǎo)方案
- 辦公機(jī)器和設(shè)備租用行業(yè)營銷策略方案
- 藥用次硝酸鉍市場發(fā)展前景分析及供需格局研究預(yù)測報告
- 仿裘皮產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 頭發(fā)造型器具出租行業(yè)營銷策略方案
- 實(shí)驗室用滴定管產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 2024年中國船級社認(rèn)證公司招聘筆試參考題庫含答案解析
- 子宮脫垂教育查房課件
- 成都至云南旅游自駕攻略
- 有限空間監(jiān)護(hù)人員安全職責(zé)
- 新版pep小學(xué)英語三四年級教材解讀
- 人教版(新插圖)二年級上冊數(shù)學(xué) 第3課時 銳角、鈍角的認(rèn)識 教學(xué)課件
- 山東省濟(jì)南市市中區(qū)實(shí)驗中學(xué)2024屆高二物理第一學(xué)期期中達(dá)標(biāo)測試試題含解析
- GB/T 16935.1-2023低壓供電系統(tǒng)內(nèi)設(shè)備的絕緣配合第1部分:原理、要求和試驗
- 工廠倉庫管理方法范本
- GB/T 43005-2023給水用連續(xù)玻纖帶纏繞增強(qiáng)聚乙烯復(fù)合管
- 醫(yī)院公共衛(wèi)生科制度職責(zé)
評論
0/150
提交評論