




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)課程設(shè)計(jì)報(bào)告小組編號(hào):小組成員:一、課程設(shè)計(jì)概述:1、題目:簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)2、實(shí)現(xiàn)內(nèi)容(1) 在內(nèi)存中開(kāi)辟一個(gè)虛擬磁盤空間作為文件存儲(chǔ)分區(qū),在其上實(shí)現(xiàn)一個(gè)簡(jiǎn)單的基于多 級(jí)目錄的單用戶單任務(wù)系統(tǒng)中的文件系統(tǒng)。在退出該文件系統(tǒng)的使用時(shí),應(yīng)將該虛擬文件 系統(tǒng)以一個(gè) Windows 文件的方式保存到磁盤上,以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁 盤空間中。(2) 文件存儲(chǔ)空間的分配可采用顯式鏈接分配或其他的辦法。(3) 空閑磁盤空間的管理可選擇位示圖或其他的辦法。如果采用位示圖來(lái)管理文件存儲(chǔ) 空間,并采用顯式鏈接分配方式,那么可以將位示圖合并到FAT中。(4) 文件目錄結(jié)構(gòu)采用多級(jí)目錄結(jié)構(gòu)。
2、為了簡(jiǎn)單起見(jiàn),可以不使用索引結(jié)點(diǎn),其中的每 個(gè)目錄項(xiàng)應(yīng)包含文件名、物理地址、長(zhǎng)度等信息,還可以通過(guò)目錄項(xiàng)實(shí)現(xiàn)對(duì)文件的讀和寫 的保護(hù)。(5) 要求提供以下操作命令:my_format :對(duì)文件存儲(chǔ)器進(jìn)行格式化, 即按照文件系統(tǒng)的結(jié)構(gòu)對(duì)虛擬磁盤空間進(jìn)行布局,并在其上創(chuàng)建根目錄以及用于管理文件存儲(chǔ)空間等的數(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用于打開(kāi)文件。my_close :用于關(guān)閉文件。my_write :用于寫文件。my_read:用于讀文
3、件。my_rm用于刪除文件。my_exitsys :用于退出文件系統(tǒng)。二、 設(shè)計(jì)思路(主要算法描述、程序流程圖等) :1系統(tǒng)主函數(shù) main()( 1)對(duì)應(yīng)命令:無(wú)(2)命令調(diào)用格式:無(wú)3)函數(shù)設(shè)計(jì)格式: void main()4)功能:系統(tǒng)主函數(shù)(5)輸入:無(wú)( 6)輸出:無(wú)(7)函數(shù)需完成的工作: 對(duì)前面定義的全局變量進(jìn)行初始化; 調(diào)用 startsys() 進(jìn)入文件系統(tǒng); 列出文件系統(tǒng)提供的各項(xiàng)功能及命令調(diào)用格式; 顯示命令行提示符,等待用戶輸入命令; 將用戶輸入的命令保存到一個(gè) buf 中; 對(duì) 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)對(duì)應(yīng)命令:無(wú)(2)命令調(diào)用格式:無(wú)( 3)函數(shù)設(shè)計(jì)格式: void startsys()4)功能:由 main() 函數(shù)調(diào)用,進(jìn)入并初始化我們所建立的文件系統(tǒng),以供用戶使用5) 輸入:無(wú)( 6)輸出:無(wú)。(7)函數(shù)需完成的工作: 申請(qǐng)?zhí)摂M磁盤空間; 使用c語(yǔ)言的庫(kù)函數(shù)fopen()打開(kāi)myfsys文件:若文件存在,則轉(zhuǎn);若文件不存在, 則創(chuàng)建之,轉(zhuǎn) 使用 c 語(yǔ)言的庫(kù)函數(shù) fread() 讀入 myfsys 文件內(nèi)容到用戶空間中的一個(gè)緩沖區(qū)中,并判斷其開(kāi)始的8個(gè)字節(jié)內(nèi)容是否為“”(文件系統(tǒng)魔數(shù)),如果是,
5、則轉(zhuǎn);否則轉(zhuǎn); 將上述緩沖區(qū)中的內(nèi)容復(fù)制到內(nèi)存中的虛擬磁盤空間中;轉(zhuǎn) 在屏幕上顯示“ myfsys 文件系統(tǒng)不存在,現(xiàn)在開(kāi)始創(chuàng)建文件系統(tǒng)”信息,并調(diào)用 my_format()對(duì)中申請(qǐng)到的虛擬磁盤空間進(jìn)行格式化操作。轉(zhuǎn); 將虛擬磁盤中的內(nèi)容保存到 myfsys文件中;轉(zhuǎn) 使用 c 語(yǔ)言的庫(kù)函數(shù) fclose() 關(guān)閉 myfsys 文件; 初始化用戶打開(kāi)文件表, 將表項(xiàng) 0 分配給根目錄文件使用, 并填寫根目錄文件的相關(guān)信 息,由于根目錄沒(méi)有上級(jí)目錄,所以表項(xiàng)中的 dirno 和 diroff 分別置為 5(根目錄所在起 始?jí)K號(hào))和 0;并將 ptrcurdir 指針指向該用戶打開(kāi)文件表項(xiàng)。 將
6、當(dāng)前目錄設(shè)置為根目錄。3磁盤格式化函數(shù) my_format()1)對(duì)應(yīng)命令: my_format( 2)命令調(diào)用格式: my_format( 3)函數(shù)設(shè)計(jì)格式: void my_format()( 4)功能:對(duì)虛擬磁盤進(jìn)行格式化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū))。(5)輸入:無(wú)( 6)輸出:無(wú)。(7)函數(shù)需完成的工作: 將虛擬磁盤第一個(gè)塊作為引導(dǎo)塊,開(kāi)始的 8 個(gè)字節(jié)是文件系統(tǒng)的魔數(shù),記為“” ;在之 后寫入文件系統(tǒng)的描述信息,如 FAT 表大小及位置、根目錄大小及位置、盤塊大小、盤塊 數(shù)量、數(shù)據(jù)區(qū)開(kāi)始位置等信息; 在引導(dǎo)塊后建立兩張完全一樣的 FAT 表,用于記錄文件所占據(jù)的磁盤塊
7、及管理虛擬磁盤塊的分配,每個(gè)FAT占據(jù)兩個(gè)磁盤塊;對(duì)于每個(gè) FAT中,前面5個(gè)塊設(shè)置為已分配,后面995 個(gè)塊設(shè)置為空閑; 在第二張F(tuán)AT后創(chuàng)建根目錄文件root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第6塊)分 配給根目錄文件,在該磁盤上創(chuàng)建兩個(gè)特殊的目錄項(xiàng): “. ”和“. ”,其內(nèi)容除了文件名不 同之外,其他字段完全相同。4更改當(dāng)前目錄函數(shù) my_cd()1 )對(duì)應(yīng)命令: my_cd2)命令調(diào)用格式: my_cd dirname( 3)函數(shù)設(shè)計(jì)格式: void my_cd(char *dirname)( 4)功能:改變當(dāng)前目錄到指定的名為 dirname 的目錄。(5)輸入:dirname :新
8、的當(dāng)前目錄的目錄名;( 6)輸出:無(wú)(7)函數(shù)需完成的工作: 調(diào)用 my_open() 打開(kāi)指定目錄名的父目錄文件,并調(diào)用 do_read() 讀入該父目錄文件內(nèi) 容到內(nèi)存中; 在父目錄文件中檢查新的當(dāng)前目錄名是否存在, 如果存在則轉(zhuǎn), 否則返回, 并顯示出 錯(cuò)信息; 調(diào)用 my_close() 關(guān)閉中打開(kāi)的父目錄文件; 調(diào)用 my_close() 關(guān)閉原當(dāng)前目錄文件; 如果新的當(dāng)前目錄文件沒(méi)有打開(kāi), 則打開(kāi)該目錄文件; 并將 ptrcurdir 指向該打開(kāi)文件 表項(xiàng); 設(shè)置當(dāng)前目錄為該目錄。5創(chuàng)建子目錄函數(shù) my_mkdir()1)對(duì)應(yīng)命令: my_mkdir( 2)命令調(diào)用格式: my_
9、mkdir dirname( 3)函數(shù)設(shè)計(jì)格式: void my_mkdir(char *dirname)( 4)功能:在當(dāng)前目錄下創(chuàng)建名為 dirname 的子目錄。(5)輸入:dirname :新建目錄的目錄名。( 6)輸出:無(wú)。(7)函數(shù)需完成的工作: 調(diào)用 do_read() 讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下新建目錄文件是否重 名,若重名則返回,并顯示錯(cuò)誤信息; 為新建子目錄文件分配一個(gè)空閑打開(kāi)文件表項(xiàng), 如果沒(méi)有空閑表項(xiàng)則返回 -1 ,并顯示錯(cuò) 誤信息; 檢查 FAT 是否有空閑的盤塊, 如有則為新建目錄文件分配一個(gè)盤塊, 否則釋放中分配 的打開(kāi)文件表項(xiàng),返回,并顯示錯(cuò)誤信
10、息; 在當(dāng)前目錄中為新建目錄文件尋找一個(gè)空閑的目錄項(xiàng)或?yàn)槠渥芳右粋€(gè)新的目錄項(xiàng) ; 需修 改當(dāng)前目錄文件的長(zhǎng)度信息, 并將當(dāng)前目錄文件的用戶打開(kāi)文件表項(xiàng)中的 fcbstate 置為 1; 準(zhǔn)備好新建目錄文件的 FCB 的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方式調(diào)用 do_write() 將其填寫到對(duì)應(yīng)的空目錄項(xiàng)中; 在新建目錄文件所分配到的磁盤塊中建立兩個(gè)特殊的目錄項(xiàng)“ . ”和“ . ”目錄項(xiàng),方 法是:首先在用戶空間中準(zhǔn)備好內(nèi)容,然后以截?cái)鄬懟蛘吒采w寫方式調(diào)用 do_write() 將其 寫到中分配到的磁盤塊中; 返回。6刪除子目錄函數(shù) rmdir()( 1)對(duì)應(yīng)命令: my_ rmdir(
11、 2)命令調(diào)用格式: my_ rmdir dirname( 1)函數(shù)設(shè)計(jì)格式: void my_rmdir(char *dirname)( 2)功能:在當(dāng)前目錄下刪除名為 dirname 的子目錄。(3)輸入:dirname :欲刪除目錄的目錄名。(4)輸出:無(wú)。(5)函數(shù)需完成的工作: 調(diào)用 do_read() 讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存, 檢查當(dāng)前目錄下欲刪除目錄文件是否存 在,若不存在則返回,并顯示錯(cuò)誤信息; 檢查欲刪除目錄文件是否為空(除了“ . ”和“ . ”外沒(méi)有其他子目錄和文件) ,可根據(jù) 其目錄項(xiàng)中記錄的文件長(zhǎng)度來(lái)判斷,若不為空則返回,并顯示錯(cuò)誤信息; 檢查該目錄文件是否已經(jīng)打
12、開(kāi),若已打開(kāi)則調(diào)用 my_close() 關(guān)閉掉; 回收該目錄文件所占據(jù)的磁盤塊,修改 FAT;0:以覆蓋寫方式調(diào)用fcbstate 置為 1; 從當(dāng)前目錄文件中清空該目錄文件的目錄項(xiàng),且 free 字段置為 do_write() 來(lái)實(shí)現(xiàn); 修改當(dāng)前目錄文件的用戶打開(kāi)表項(xiàng)中的長(zhǎng)度信息,并將表項(xiàng)中的 返回。7顯示目錄函數(shù) my_ls()( 1)對(duì)應(yīng)命令: my_ls( 2)命令調(diào)用格式: my_ls( 3)函數(shù)設(shè)計(jì)格式: void my_ls(void)( 4)功能:顯示當(dāng)前目錄的內(nèi)容(子目錄和文件信息) 。(5)輸入:無(wú)( 6)輸出:無(wú)(7)函數(shù)需完成的工作: 調(diào)用 do_read() 讀出當(dāng)
13、前目錄文件內(nèi)容到內(nèi)存; 將讀出的目錄文件的信息按照一定的格式顯示到屏幕上; 返回。8創(chuàng)建文件函數(shù) my_create()1)對(duì)應(yīng)命令: my_create( 2)命令調(diào)用格式: my_create filename( 3)函數(shù)設(shè)計(jì)格式: int my_create (char *filename)( 4)功能:創(chuàng)建名為 filename 的新文件。(5)輸入:filename :新建文件的文件名,可能包含路徑。( 6)輸出:若創(chuàng)建成功,返回該文件的文件描述符(文件打開(kāi)表中的數(shù)組下標(biāo));否則返回-1。(7)函數(shù)需完成的工作: 為新文件分配一個(gè)空閑打開(kāi)文件表項(xiàng),如果沒(méi)有空閑表項(xiàng)則返回 -1 ,并顯
14、示錯(cuò)誤信息; 若新文件的父目錄文件還沒(méi)有打開(kāi),則調(diào)用my_open()打開(kāi);若打開(kāi)失敗,則釋放中為新建文件分配的空閑文件打開(kāi)表項(xiàng),返回 -1 ,并顯示錯(cuò)誤信息; 調(diào)用 do_read() 讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下新文件是否重名,若重名 則釋放中分配的打開(kāi)文件表項(xiàng),并調(diào)用 my_close()關(guān)閉中打開(kāi)的目錄文件;然后返回 -1 ,并顯示錯(cuò)誤信息; 檢查FAT是否有空閑的盤塊,如有則為新文件分配一個(gè)盤塊,否則釋放中分配的打開(kāi) 文件表項(xiàng),并調(diào)用my_close()關(guān)閉中打開(kāi)的目錄文件;返回-1,并顯示錯(cuò)誤信息; 在父目錄中為新文件尋找一個(gè)空閑的目錄項(xiàng)或?yàn)槠渥芳右粋€(gè)新的目錄項(xiàng) ;需修
15、改該目錄 文件的長(zhǎng)度信息,并將該目錄文件的用戶打開(kāi)文件表項(xiàng)中的 fcbstate 置為 1; 準(zhǔn)備好新文件的 FCB 的內(nèi)容,文件的屬性為數(shù)據(jù)文件,長(zhǎng)度為0,以覆蓋寫方式調(diào)用do_write() 將其填寫到中分配到的空目錄項(xiàng)中; 為新文件填寫中分配到的空閑打開(kāi)文件表項(xiàng), fcbstate 字段值為 0,讀寫指針值為 0 ; 調(diào)用 my_close() 關(guān)閉中打開(kāi)的父目錄文件; 將新文件的打開(kāi)文件表項(xiàng)序號(hào)作為其文件描述符返回。9刪除文件函數(shù) my_rm()( 1)對(duì)應(yīng)命令: my_rm( 2)命令調(diào)用格式: my_rm filename( 3)函數(shù)設(shè)計(jì)格式: void my_rm(char *f
16、ilename)( 4)功能:刪除名為 filename 的文件。(5)輸入:filename :欲刪除文件的文件名,可能還包含路徑。( 6)輸出:無(wú)。(7)函數(shù)需完成的工作: 若欲刪除文件的父目錄文件還沒(méi)有打開(kāi),貝U調(diào)用my_open()打開(kāi);若打開(kāi)失敗,貝U返回, 并顯示錯(cuò)誤信息; 調(diào)用 do_read() 讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下欲刪除文件是否存在,若 不存在則返回,并顯示錯(cuò)誤信息; 檢查該文件是否已經(jīng)打開(kāi),若已打開(kāi)則關(guān)閉掉; 回收該文件所占據(jù)的磁盤塊,修改 FAT; 從文件的父目錄文件中清空該文件的目錄項(xiàng),且 free 字段置為 0 :以覆蓋寫方式調(diào)用 do_write
17、() 來(lái)實(shí)現(xiàn); 修改該父目錄文件的用戶打開(kāi)文件表項(xiàng)中的長(zhǎng)度信息,并將該表項(xiàng)中的 fcbstate 置為 1; 返回。10打開(kāi)文件函數(shù) my_open()( 1)對(duì)應(yīng)命令: my_open( 2)命令調(diào)用格式: my_open filename( 3)函數(shù)設(shè)計(jì)格式: int my_open(char *filename)( 4)功能:打開(kāi)當(dāng)前目錄下名為 filename 的文件。(5)輸入:filename :欲打開(kāi)文件的文件名( 6)輸出:若打開(kāi)成功,返回該文件的描述符(在用戶打開(kāi)文件表中表項(xiàng)序號(hào));否則返回-1。(7)函數(shù)需完成的工作: 檢查該文件是否已經(jīng)打開(kāi),若已打開(kāi)則返回 -1 ,并顯示
18、錯(cuò)誤信息; 調(diào)用 do_read() 讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲打開(kāi)文件是否存在,若 不存在則返回 -1 ,并顯示錯(cuò)誤信息; 檢查用戶打開(kāi)文件表中是否有空表項(xiàng), 若有則為欲打開(kāi)文件分配一個(gè)空表項(xiàng), 若沒(méi)有則 返回-1 ,并顯示錯(cuò)誤信息; 為該文件填寫空白用戶打開(kāi)文件表表項(xiàng)內(nèi)容,讀寫指針置為0; 將該文件所分配到的空白用戶打開(kāi)文件表表項(xiàng)序號(hào)(數(shù)組下標(biāo))作為文件描述符 fd 返 回。11關(guān)閉文件函數(shù) my_close()( 1)對(duì)應(yīng)命令: my_close( 2)命令調(diào)用格式: my_close fd( 3)函數(shù)設(shè)計(jì)格式: void my_close(int fd)(4)功能:關(guān)閉
19、前面由my_open()打開(kāi)的文件描述符為fd的文件。( 5)輸入:fd :文件描述符。6)輸出:無(wú)(7)函數(shù)需完成的工作: 檢查 fd 的有效性( fd 不能超出用戶打開(kāi)文件表所在數(shù)組的最大下標(biāo)) ,如果無(wú)效則返 回-1; 檢查用戶打開(kāi)文件表表項(xiàng)中的fcbstate字段的值,如果為1則需要將該文件的FCB的 內(nèi)容保存到虛擬磁盤上該文件的目錄項(xiàng)中,方法是:打開(kāi)該文件的父目錄文件,以覆蓋寫方式調(diào)用do_write()將欲關(guān)閉文件的FCB寫入父目錄文件的相應(yīng)盤塊中; 回收該文件占據(jù)的用戶打開(kāi)文件表表項(xiàng)(進(jìn)行清空操作) ,并將 topenfile 字段置為 0; 返回。12寫文件函數(shù) my_writ
20、e()(1)對(duì)應(yīng)命令: my_write(2)命令調(diào)用格式: my_write fd( 3)函數(shù)設(shè)計(jì)格式: int my_write(int fd)(4)功能:將用戶通過(guò)鍵盤輸入的內(nèi)容寫到fd 所指定的文件中。磁盤文件的讀寫操作都必須以完整的數(shù)據(jù)塊為單位進(jìn)行,在寫操作時(shí),先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖區(qū)的大小與 磁盤塊的大小相同,然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出時(shí)先將一個(gè)磁盤 塊中的內(nèi)容讀到緩沖區(qū)中,然后再傳送到用戶區(qū)。本實(shí)例為了簡(jiǎn)便起見(jiàn),沒(méi)有設(shè)置緩沖區(qū) 管理,只是在讀寫文件時(shí)由用戶使用 malloc() 申請(qǐng)一塊空間作為緩沖區(qū),讀寫操作結(jié)束后 使用 free() 釋放掉。寫操作常有
21、三種方式:截?cái)鄬憽⒏采w寫和追加寫。截?cái)鄬懯欠艞壴瓉?lái)文件的內(nèi)容,重新寫 文件;覆蓋寫是修改文件在當(dāng)前讀寫指針?biāo)傅奈恢瞄_(kāi)始的部分內(nèi)容;追加寫是在原文件的最后添加新的內(nèi)容。在本實(shí)例中,輸入寫文件命令后,系統(tǒng)會(huì)出現(xiàn)提示讓用戶選擇其中的一種寫方式,并將隨后鍵盤輸入的內(nèi)容按照所選的方式寫到文件中,鍵盤輸入內(nèi)容通過(guò)CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束。(5)輸入:fd : open() 函數(shù)的返回值,文件的描述符;( 6)輸出:實(shí)際寫入的字節(jié)數(shù)。( 7)函數(shù)需完成的工作: 檢查 fd 的有效性( fd 不能超出用戶打開(kāi)文件表所在數(shù)組的最大下標(biāo)) ,如果無(wú)效則返回-1 ,并顯示出錯(cuò)信息; 提示并等待用戶輸入寫
22、方式: ( 1 :截?cái)鄬懀?2 :覆蓋寫; 3 :追加寫) 如果用戶要求的寫方式是截?cái)鄬懀?則釋放文件除第一塊外的其他磁盤空間內(nèi)容 (查找并修改FAT表),將內(nèi)存用戶打開(kāi)文件表項(xiàng)中文件長(zhǎng)度修改為 0,將讀寫指針置為0并轉(zhuǎn); 如果用戶要求的寫方式是追加寫, 則修改文件的當(dāng)前讀寫指針位置到文件的末尾, 并轉(zhuǎn); 如果寫方式是覆蓋寫,則直接轉(zhuǎn); 提示用戶:整個(gè)輸入內(nèi)容通過(guò) CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束;用戶可分多次輸入寫 入內(nèi)容,每次用回車結(jié)束; 等待用戶從鍵盤輸入文件內(nèi)容, 并將用戶的本次輸入內(nèi)容保存到一臨時(shí)變量 text 中, 要求每次輸入以回車結(jié)束,全部結(jié)束用 CTR+Z鍵(或其他設(shè)定的鍵
23、); 調(diào)用 do_write() 函數(shù)將通過(guò)鍵盤鍵入的內(nèi)容寫到文件中 如果 do_write() 函數(shù)的返回值為非負(fù)值,則將實(shí)際寫入字節(jié)數(shù)增加 do_write() 函數(shù)返 回值,否則顯示出錯(cuò)信息,并轉(zhuǎn); 如果text中最后一個(gè)字符不是結(jié)束字符 CTR+Z則轉(zhuǎn)繼續(xù)進(jìn)行寫操作;否則轉(zhuǎn); 如果當(dāng)前讀寫指針位置大于用戶打開(kāi)文件表項(xiàng)中的文件長(zhǎng)度, 則修改打開(kāi)文件表項(xiàng)中的 文件長(zhǎng)度信息,并將 fcbstate 置 1; 返回實(shí)際寫入的字節(jié)數(shù)。13實(shí)際寫文件函數(shù) do_write()(1) 對(duì)應(yīng)命令:無(wú)(2) 命令調(diào)用格式:無(wú)( 3)函數(shù)設(shè)計(jì)格式: int my_write(int fd, char *t
24、ext , int len , char wstyle)(4) 功能:被寫文件函數(shù) my_write() 調(diào)用,用來(lái)將鍵盤輸入的內(nèi)容寫到相應(yīng)的文件中去。(5) 輸入:fd : open() 函數(shù)的返回值,文件的描述符;text :指向要寫入的內(nèi)容的指針;len :本次要求寫入字節(jié)數(shù)wstyle :寫方式6)輸出:實(shí)際寫入的字節(jié)數(shù)(7)函數(shù)需完成的工作: 用malloc()申請(qǐng)1024B的內(nèi)存空間作為讀寫磁盤的緩沖區(qū) buf,申請(qǐng)失敗則返回-1 ,并 顯示出錯(cuò)信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號(hào)和塊內(nèi)偏移 off ,并利用打開(kāi)文件表表項(xiàng)中的首塊號(hào)及FAT表的相關(guān)內(nèi)容將邏輯塊塊號(hào)轉(zhuǎn)換成對(duì)應(yīng)的磁盤塊塊
25、號(hào)blkno ;如果找不到對(duì)應(yīng)的磁盤塊,則需要檢索FAT為該邏輯塊分配一新的磁盤塊,并將對(duì)應(yīng)的磁盤塊塊號(hào)blkno登記到FAT中,若分配失敗,則返回-1,并顯示出錯(cuò)信息; 如果是覆蓋寫,或者如果當(dāng)前讀寫指針?biāo)鶎?duì)應(yīng)的塊內(nèi)偏移 off 不等于 0,則將塊號(hào)為 blkno的虛擬磁盤塊全部1024B的內(nèi)容讀到緩沖區(qū)buf中;否則便用ASCII碼0清空buf ; 將 text 中未寫入的內(nèi)容暫存到緩沖區(qū) buff 的第 off 字節(jié)開(kāi)始的位置,直到緩沖區(qū)滿, 或者接收到結(jié)束字符CTR+Z為止;將本次寫入字節(jié)數(shù)記錄到tmplen中; 將buf中1024B的內(nèi)容寫入到塊號(hào)為blkno的虛擬磁盤塊中; 將當(dāng)前
26、讀寫指針修改為原來(lái)的值加上 tmplen ;并將本次實(shí)際寫入的字節(jié)數(shù)增加 tmplen ; 如果tmplen小于len,則轉(zhuǎn)繼續(xù)寫入;否則轉(zhuǎn); 返回本次實(shí)際寫入的字節(jié)數(shù)。14讀文件函數(shù) my_read()1) 對(duì)應(yīng)命令: my_read2)命令調(diào)用格式: my_read fd len( 3)函數(shù)設(shè)計(jì)格式: int myread (int fd, int len)( 4)功能:讀出指定文件中從讀寫指針開(kāi)始的長(zhǎng)度為len 的內(nèi)容到用戶空間中。(5)輸入:fd : open() 函數(shù)的返回值,文件的描述符;len: 要從文件中讀出的字節(jié)數(shù)。(6)輸出:實(shí)際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 定義
27、一個(gè)字符型數(shù)組 textlen ,用來(lái)接收用戶從文件中讀出的文件內(nèi)容; 檢查 fd 的有效性( fd 不能超出用戶打開(kāi)文件表所在數(shù)組的最大下標(biāo)) ,如果無(wú)效則返 回-1 ,并顯示出錯(cuò)信息; 調(diào)用 do_read() 將指定文件中的 len 字節(jié)內(nèi)容讀出到 text 中; 如果 do_read() 的返回值為負(fù),則顯示出錯(cuò)信息; 否則將 text 中的內(nèi)容顯示到屏幕上; 返回。15實(shí)際讀文件函數(shù) do_read()(1)對(duì)應(yīng)命令:無(wú)2)命令調(diào)用格式:無(wú)3) 函數(shù)設(shè)計(jì)格式: int do_read (int fd, int len,char *text)( 4)功能:被 my_read() 調(diào)用,
28、讀出指定文件中從讀寫指針開(kāi)始的長(zhǎng)度為len 的內(nèi)容到用戶空間的 text 中。(5)輸入:fd : open() 函數(shù)的返回值,文件的描述符;len: 要求從文件中讀出的字節(jié)數(shù)。text :指向存放讀出數(shù)據(jù)的用戶區(qū)地址(6)輸出:實(shí)際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 使用malloc()申請(qǐng)1024B空間作為緩沖區(qū)buf,申請(qǐng)失敗則返回-1,并顯示出錯(cuò)信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號(hào)及塊內(nèi)偏移量 off ,利用打開(kāi)文件表表項(xiàng)中的首塊號(hào)查找FAT表,找到該邏輯塊所在的磁盤塊塊號(hào);將該磁盤塊塊號(hào)轉(zhuǎn)化為虛擬磁盤上的內(nèi)存位置; 將該內(nèi)存位置開(kāi)始的1024B(一個(gè)磁盤塊)內(nèi)容讀入buf中; 比較
29、buf中從偏移量off開(kāi)始的剩余字節(jié)數(shù)是否大于等于應(yīng)讀寫的字節(jié)數(shù) len,如果是, 則將從 off 開(kāi)始的 buf 中的 len 長(zhǎng)度的內(nèi)容讀入到 text 中;否則,將從 off 開(kāi)始的 buf 中的剩余內(nèi)容讀入到 text 中; 將讀寫指針增加中已讀字節(jié)數(shù),將應(yīng)讀寫的字節(jié)數(shù)len減去中已讀字節(jié)數(shù),若len大于0,則轉(zhuǎn);否則轉(zhuǎn); 使用free()釋放中申請(qǐng)的buf 返回實(shí)際讀出的字節(jié)數(shù)。16.退出文件系統(tǒng)函數(shù)my_exitsys()(1) 對(duì)應(yīng)命令:my_exitsys(2) 命令調(diào)用格式:my_ exitsys(1) 函數(shù)設(shè)計(jì)格式:void my_exitsys()(2) 功能:退出文件系
30、統(tǒng)。(3) 輸入:無(wú)(4) 輸出:無(wú)。(5) 函數(shù)需完成的工作: 使用C庫(kù)函數(shù)fopen()打開(kāi)磁盤上的myfsys文件; 將虛擬磁盤空間中的所有內(nèi)容保存到磁盤上的myfsys文件中; 使用c語(yǔ)言的庫(kù)函數(shù)fclose()關(guān)閉myfsys文件; 撤銷用戶打開(kāi)文件表,釋放其內(nèi)存空間 釋放虛擬磁盤空間。流程圖程序啟動(dòng)文件系加載文件系統(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í)打開(kāi)文件個(gè)數(shù) t#define MAXTEXT 10000 /* 文件控制塊 */typedef struct FCBchar filename8; /文件名char exname3; /文件擴(kuò)展名unsigned char attribute;/
32、文件屬性字段,值為 0 時(shí)表示目錄文件,值為 1時(shí)表示數(shù)據(jù)文件unsigned short time; /文件創(chuàng)建時(shí)間unsigned short date; /文件創(chuàng)建日期unsigned short first; /文件起始盤塊號(hào)unsigned long length; /文件長(zhǎng)度char free; /表示目錄項(xiàng)是否為空,若值為 0,表示空,值為 1,表示已分配fcb;/* 文件分配表 */ typedef struct FATunsigned short id; / 磁盤塊的狀態(tài)(空閑的,最后的,下一個(gè))fat;/* 用戶打開(kāi)文件表 */unsignedtypedef struct
33、USEROPENchar filename8; /文件名char exname3; /文件擴(kuò)展名unsigned char attribute;/文件屬性字段,值為 0 時(shí)表示目錄文件,值為 1時(shí)表示數(shù)據(jù)文件unsigned short time; /文件創(chuàng)建時(shí)間unsigned short date; /文件創(chuàng)建日期unsigned short first; /文件起始盤塊號(hào)long length;/ 文件長(zhǎng)度(對(duì)數(shù)據(jù)文件是字節(jié)數(shù),對(duì)目錄文件可以是目錄項(xiàng)個(gè)數(shù))char free; /表示目錄項(xiàng)是否為空,若值為 0,表示空,值為 1,表示已分配unsigned short dirno; /相應(yīng)
34、打開(kāi)文件的目錄項(xiàng)在父目錄文件中的盤塊號(hào)int diroff; /相應(yīng)打開(kāi)文件的目錄項(xiàng)在父目錄文件的 dirno 盤塊中的目錄項(xiàng)序號(hào)char dir80; /相應(yīng)打開(kāi)文件所在的路徑名,這樣方便快速檢查出指定文件是否已經(jīng)打開(kāi)int father; /父目錄在打開(kāi)文件表項(xiàng)的位置int count; /讀寫指針在文件中的位置 , 文件的總字符數(shù)char fcbstate; /是否修改了文件的FCB的內(nèi)容,如果修改了置為1,否則為0char topenfile; /表示該用戶打開(kāi)表項(xiàng)是否為空,若值為 0,表示為空,否則表示已被某打開(kāi)文件占據(jù)useropen;/* 引導(dǎo)塊 */typedef struct
35、 BLOCK0char magic10; /文件系統(tǒng)魔數(shù)char information200;/ 存儲(chǔ)一些描述信息,如磁盤塊大小、磁盤塊數(shù)量、最多打開(kāi)文件數(shù)等unsigned short root; /根目錄文件的起始盤塊號(hào)unsigned char *startblock; / 虛擬磁盤上數(shù)據(jù)區(qū)開(kāi)始位置 block0;unsigned char *myvhard; / 指向虛擬磁盤的起始地址useropen openfilelistMAXOPENFILE; / 用戶打開(kāi)文件表數(shù)組int curdir; /用戶打開(kāi)文件表中的當(dāng)前目錄所在打開(kāi)文件表項(xiàng)的位置char currentdir80;
36、/ 記錄當(dāng)前目錄的目錄名(包括目錄的路徑)unsigned char* startp; /記錄虛擬磁盤上數(shù)據(jù)區(qū)開(kāi)始位置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); / 打開(kāi)文件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(); / 尋找空閑文件表項(xiàng)void startsys()FILE *fp;unsigned char bufSIZE;fcb *root;int i;申請(qǐng)?zhí)摂M磁盤空間myvhard = (unsigned char *)malloc(SIZE);/ memset(myvhard, 0, SIZE);/ 將 myvhard 中前 SIZE 個(gè)字節(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 開(kāi)始寫一個(gè) fcb 大小的內(nèi)容到當(dāng)前目錄文件末尾fd = my_open(dirname);/ 返回新建立的目錄文件在用戶打開(kāi)文件數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上半年安徽蕪湖九鴻實(shí)業(yè)限公司招聘3人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省鹽業(yè)投資控股集團(tuán)限公司選聘管理人員9人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽淮南大通區(qū)人民政府政務(wù)服務(wù)中心招考32人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽國(guó)營(yíng)蕪湖機(jī)械廠招聘15人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽合肥東部新中心建設(shè)投資限公司招聘8人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波市鄞州區(qū)教育系統(tǒng)招考教師易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波市規(guī)劃局下屬事業(yè)單位招考易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波市水利局屬事業(yè)單位招考工作人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波市奉化市國(guó)土資源局招考編外人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧夏石嘴山工貿(mào)職業(yè)技術(shù)學(xué)院招聘事業(yè)單位工作人員7人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 華東師范大學(xué)《外國(guó)人文經(jīng)典(下)》2021-2022學(xué)年第一學(xué)期期末試卷
- 基礎(chǔ)護(hù)理及病房管理
- 辦理拆遷事項(xiàng)委托書(shū)
- 2024年《工會(huì)法》知識(shí)競(jìng)賽題庫(kù)及答案
- 煤礦事故現(xiàn)場(chǎng)處置管理制度
- CRISPR-Cas9-基因編輯技術(shù)簡(jiǎn)介
- 2024年湖南省高考化學(xué)試卷真題(含答案解析)
- 上海市精神衛(wèi)生中心招聘考試試卷及答案
- 2024年大學(xué)試題(財(cái)經(jīng)商貿(mào))-國(guó)際服務(wù)貿(mào)易考試近5年真題集錦(頻考類試題)帶答案
- 投標(biāo)報(bào)價(jià)編制委托協(xié)議書(shū)
- 《擲一擲》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年人教版五年級(jí)數(shù)學(xué)上冊(cè)
評(píng)論
0/150
提交評(píng)論