版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 操作系統(tǒng)課程設(shè)計報告</p><p><b> 一、課程設(shè)計概述:</b></p><p> 1、題目:簡單文件系統(tǒng)的實現(xiàn)</p><p><b> 2、實現(xiàn)內(nèi)容</b></p><p> 在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲分區(qū),在其上實現(xiàn)一個簡單的基于多級目錄的
2、單用戶單任務(wù)系統(tǒng)中的文件系統(tǒng)。在退出該文件系統(tǒng)的使用時,應(yīng)將該虛擬文件系統(tǒng)以一個Windows 文件的方式保存到磁盤上,以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中。</p><p> 文件存儲空間的分配可采用顯式鏈接分配或其他的辦法。</p><p> 空閑磁盤空間的管理可選擇位示圖或其他的辦法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,那么可以將位示圖合并到FAT中
3、。</p><p> 文件目錄結(jié)構(gòu)采用多級目錄結(jié)構(gòu)。為了簡單起見,可以不使用索引結(jié)點,其中的每個目錄項應(yīng)包含文件名、物理地址、長度等信息,還可以通過目錄項實現(xiàn)對文件的讀和寫的保護(hù)。</p><p> 要求提供以下操作命令:</p><p> my_format:對文件存儲器進(jìn)行格式化,即按照文件系統(tǒng)的結(jié)構(gòu)對虛擬磁盤空間進(jìn)行布局,并在其上創(chuàng)建根目錄以及用于管理文
4、件存儲空間等的數(shù)據(jù)結(jié)構(gòu)。</p><p> my_mkdir:用于創(chuàng)建子目錄。</p><p> my_rmdir:用于刪除子目錄。</p><p> my_ls:用于顯示目錄中的內(nèi)容。</p><p> my_cd:用于更改當(dāng)前目錄。</p><p> my_create:用于創(chuàng)建文件。</p>
5、<p> my_open:用于打開文件。</p><p> my_close:用于關(guān)閉文件。</p><p> my_write:用于寫文件。</p><p> my_read:用于讀文件。</p><p> my_rm:用于刪除文件。</p><p> my_exitsys:用于退出文件系統(tǒng)
6、。</p><p> 設(shè)計思路(主要算法描述、程序流程圖等):</p><p> 1.系統(tǒng)主函數(shù)main()</p><p><b> (1)對應(yīng)命令:無</b></p><p> ?。?)命令調(diào)用格式:無</p><p> (3)函數(shù)設(shè)計格式:void main()</p>
7、<p> (4)功能:系統(tǒng)主函數(shù)</p><p><b> ?。?)輸入:無</b></p><p><b> ?。?)輸出:無</b></p><p> ?。?)函數(shù)需完成的工作:</p><p> ① 對前面定義的全局變量進(jìn)行初始化; </p><p>
8、?、?調(diào)用startsys()進(jìn)入文件系統(tǒng);</p><p> ?、?列出文件系統(tǒng)提供的各項功能及命令調(diào)用格式;</p><p> ?、?顯示命令行提示符,等待用戶輸入命令;</p><p> ?、?將用戶輸入的命令保存到一個buf中;</p><p> ⑥ 對buf中的內(nèi)容進(jìn)行命令解析,并調(diào)用相應(yīng)的函數(shù)執(zhí)行用戶鍵入的命令;</p&g
9、t;<p> ?、?如果命令不是“my_exitsys”,則命令執(zhí)行完畢后轉(zhuǎn)④。</p><p> 2. 進(jìn)入文件系統(tǒng)函數(shù)startsys()</p><p><b> ?。?)對應(yīng)命令:無</b></p><p> (2)命令調(diào)用格式:無</p><p> ?。?)函數(shù)設(shè)計格式:void starts
10、ys()</p><p> (4)功能:由main()函數(shù)調(diào)用,進(jìn)入并初始化我們所建立的文件系統(tǒng),以供用戶使用。</p><p> ?。?)輸入:無 </p><p><b> (6)輸出:無。</b></p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?申請?zhí)摂M磁盤空間
11、;</p><p> ② 使用c語言的庫函數(shù)fopen()打開myfsys文件:若文件存在,則轉(zhuǎn)③;若文件不存在,則創(chuàng)建之,轉(zhuǎn)⑤</p><p> ?、?使用c語言的庫函數(shù)fread()讀入myfsys文件內(nèi)容到用戶空間中的一個緩沖區(qū)中,并判斷其開始的8個字節(jié)內(nèi)容是否為“10101010”(文件系統(tǒng)魔數(shù)),如果是,則轉(zhuǎn)④;否則轉(zhuǎn)⑤;</p><p> ④ 將上述
12、緩沖區(qū)中的內(nèi)容復(fù)制到內(nèi)存中的虛擬磁盤空間中;轉(zhuǎn)⑦</p><p> ?、?在屏幕上顯示“myfsys文件系統(tǒng)不存在,現(xiàn)在開始創(chuàng)建文件系統(tǒng)”信息,并調(diào)用my_format()對①中申請到的虛擬磁盤空間進(jìn)行格式化操作。轉(zhuǎn)⑥;</p><p> ⑥ 將虛擬磁盤中的內(nèi)容保存到myfsys文件中;轉(zhuǎn)⑦</p><p> ?、?使用c語言的庫函數(shù)fclose()關(guān)閉myfsy
13、s文件;</p><p> ?、?初始化用戶打開文件表,將表項0分配給根目錄文件使用,并填寫根目錄文件的相關(guān)信息,由于根目錄沒有上級目錄,所以表項中的dirno和diroff分別置為5(根目錄所在起始塊號)和0;并將ptrcurdir指針指向該用戶打開文件表項。</p><p> ⑨ 將當(dāng)前目錄設(shè)置為根目錄。</p><p> 3.磁盤格式化函數(shù)my_forma
14、t()</p><p> ?。?)對應(yīng)命令:my_format</p><p> ?。?)命令調(diào)用格式:my_format</p><p> (3)函數(shù)設(shè)計格式:void my_format()</p><p> ?。?)功能:對虛擬磁盤進(jìn)行格式化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū))。</p><p> (
15、5)輸入:無 </p><p><b> (6)輸出:無。</b></p><p> (7)函數(shù)需完成的工作:</p><p> ?、?將虛擬磁盤第一個塊作為引導(dǎo)塊,開始的8個字節(jié)是文件系統(tǒng)的魔數(shù),記為“10101010”;在之后寫入文件系統(tǒng)的描述信息,如FAT表大小及位置、根目錄大小及位置、盤塊大小、盤塊數(shù)量、數(shù)據(jù)區(qū)開始位置等信息;&
16、lt;/p><p> ?、?在引導(dǎo)塊后建立兩張完全一樣的FAT表,用于記錄文件所占據(jù)的磁盤塊及管理虛擬磁盤塊的分配,每個FAT占據(jù)兩個磁盤塊;對于每個FAT中,前面5個塊設(shè)置為已分配,后面995個塊設(shè)置為空閑;</p><p> ?、?在第二張F(tuán)AT后創(chuàng)建根目錄文件root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第6塊)分配給根目錄文件,在該磁盤上創(chuàng)建兩個特殊的目錄項:“.”和“..”,其內(nèi)容除了文件
17、名不同之外,其他字段完全相同。 </p><p> 4.更改當(dāng)前目錄函數(shù)my_cd()</p><p> (1)對應(yīng)命令:my_cd </p><p> ?。?)命令調(diào)用格式:my_cd dirname</p><p> (3)函數(shù)設(shè)計格式:void my_cd(char *dirname)</p><p>
18、(4)功能:改變當(dāng)前目錄到指定的名為dirname的目錄。</p><p><b> ?。?)輸入:</b></p><p> dirname:新的當(dāng)前目錄的目錄名; </p><p><b> ?。?)輸出:無</b></p><p> ?。?)函數(shù)需完成的工作:</p&
19、gt;<p> ?、?調(diào)用my_open()打開指定目錄名的父目錄文件,并調(diào)用do_read()讀入該父目錄文件內(nèi)容到內(nèi)存中;</p><p> ?、?在父目錄文件中檢查新的當(dāng)前目錄名是否存在,如果存在則轉(zhuǎn)③,否則返回,并顯示出錯信息;</p><p> ?、?調(diào)用my_close()關(guān)閉①中打開的父目錄文件;</p><p> ④ 調(diào)用my_clo
20、se()關(guān)閉原當(dāng)前目錄文件;</p><p> ⑤ 如果新的當(dāng)前目錄文件沒有打開,則打開該目錄文件;并將ptrcurdir指向該打開文件表項; </p><p> ⑥ 設(shè)置當(dāng)前目錄為該目錄。</p><p> 5.創(chuàng)建子目錄函數(shù)my_mkdir()</p><p> ?。?)對應(yīng)命令:my_mkdir</p><p&
21、gt; (2)命令調(diào)用格式:my_ mkdir dirname</p><p> ?。?)函數(shù)設(shè)計格式:void my_mkdir(char *dirname)</p><p> ?。?)功能:在當(dāng)前目錄下創(chuàng)建名為dirname的子目錄。</p><p><b> ?。?)輸入:</b></p><p> dirna
22、me:新建目錄的目錄名。 </p><p><b> ?。?)輸出:無。</b></p><p> ?。?)函數(shù)需完成的工作:</p><p> ① 調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下新建目錄文件是否重名,若重名則返回,并顯示錯誤信息; </p><p> ?、?為新建子
23、目錄文件分配一個空閑打開文件表項,如果沒有空閑表項則返回-1,并顯示錯誤信息;</p><p> ③ 檢查FAT是否有空閑的盤塊,如有則為新建目錄文件分配一個盤塊,否則釋放①中分配的打開文件表項,返回,并顯示錯誤信息;</p><p> ④ 在當(dāng)前目錄中為新建目錄文件尋找一個空閑的目錄項或為其追加一個新的目錄項;需修改當(dāng)前目錄文件的長度信息,并將當(dāng)前目錄文件的用戶打開文件表項中的fcb
24、state置為1;</p><p> ?、?準(zhǔn)備好新建目錄文件的FCB的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方式調(diào)用do_write()將其填寫到對應(yīng)的空目錄項中;</p><p> ?、?在新建目錄文件所分配到的磁盤塊中建立兩個特殊的目錄項“.”和“..”目錄項,方法是:首先在用戶空間中準(zhǔn)備好內(nèi)容,然后以截斷寫或者覆蓋寫方式調(diào)用do_write()將其寫到③中分配到的磁盤塊中;</
25、p><p><b> ?、?返回。</b></p><p> 6.刪除子目錄函數(shù)rmdir()</p><p> ?。?)對應(yīng)命令:my_ rmdir</p><p> ?。?)命令調(diào)用格式:my_ rmdir dirname</p><p> ?。?)函數(shù)設(shè)計格式:void my_rmdir(ch
26、ar *dirname)</p><p> (2)功能:在當(dāng)前目錄下刪除名為dirname的子目錄。</p><p><b> ?。?)輸入:</b></p><p> dirname:欲刪除目錄的目錄名。 </p><p><b> ?。?)輸出:無。</b></p&g
27、t;<p> ?。?)函數(shù)需完成的工作:</p><p> ① 調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下欲刪除目錄文件是否存在,若不存在則返回,并顯示錯誤信息;</p><p> ?、?檢查欲刪除目錄文件是否為空(除了“.”和“..”外沒有其他子目錄和文件),可根據(jù)其目錄項中記錄的文件長度來判斷,若不為空則返回,并顯示錯誤信息; </p>
28、<p> ③ 檢查該目錄文件是否已經(jīng)打開,若已打開則調(diào)用my_close()關(guān)閉掉;</p><p> ?、?回收該目錄文件所占據(jù)的磁盤塊,修改FAT;</p><p> ?、?從當(dāng)前目錄文件中清空該目錄文件的目錄項,且free字段置為0:以覆蓋寫方式調(diào)用do_write()來實現(xiàn);</p><p> ⑥ 修改當(dāng)前目錄文件的用戶打開表項中的長度信息
29、,并將表項中的fcbstate置為1;</p><p><b> ⑦ 返回。</b></p><p> 7.顯示目錄函數(shù)my_ls()</p><p> (1)對應(yīng)命令:my_ls</p><p> ?。?)命令調(diào)用格式:my_ls</p><p> (3)函數(shù)設(shè)計格式:void my_l
30、s(void)</p><p> (4)功能:顯示當(dāng)前目錄的內(nèi)容(子目錄和文件信息)。</p><p> ?。?)輸入:無 </p><p><b> (6)輸出:無</b></p><p> ?。?)函數(shù)需完成的工作:</p><p> ① 調(diào)用do_read()讀出當(dāng)前
31、目錄文件內(nèi)容到內(nèi)存;</p><p> ?、?將讀出的目錄文件的信息按照一定的格式顯示到屏幕上; </p><p><b> ③ 返回。 </b></p><p> 8.創(chuàng)建文件函數(shù)my_create() </p><p> ?。?)對應(yīng)命令:my_create</p><p> ?。?)
32、命令調(diào)用格式:my_create filename</p><p> ?。?)函數(shù)設(shè)計格式:int my_create (char *filename)</p><p> (4)功能:創(chuàng)建名為filename的新文件。</p><p><b> ?。?)輸入:</b></p><p> filename:新建文件的文
33、件名,可能包含路徑。 </p><p> ?。?)輸出:若創(chuàng)建成功,返回該文件的文件描述符(文件打開表中的數(shù)組下標(biāo));否則返回-1。</p><p> ?。?)函數(shù)需完成的工作:</p><p> ① 為新文件分配一個空閑打開文件表項,如果沒有空閑表項則返回-1,并顯示錯誤信息;</p><p> ② 若新文件的父目錄文
34、件還沒有打開,則調(diào)用my_open()打開;若打開失敗,則釋放①中為新建文件分配的空閑文件打開表項,返回-1,并顯示錯誤信息;</p><p> ?、?調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下新文件是否重名,若重名則釋放①中分配的打開文件表項,并調(diào)用my_close()關(guān)閉②中打開的目錄文件;然后返回-1,并顯示錯誤信息;</p><p> ?、?檢查FAT是否有空閑
35、的盤塊,如有則為新文件分配一個盤塊,否則釋放①中分配的打開文件表項,并調(diào)用my_close()關(guān)閉②中打開的目錄文件;返回-1,并顯示錯誤信息; </p><p> ?、?在父目錄中為新文件尋找一個空閑的目錄項或為其追加一個新的目錄項;需修改該目錄文件的長度信息,并將該目錄文件的用戶打開文件表項中的fcbstate置為1;</p><p> ?、?準(zhǔn)備好新文件的FCB的內(nèi)容,文件的屬性為數(shù)
36、據(jù)文件,長度為0,以覆蓋寫方式調(diào)用do_write()將其填寫到⑤中分配到的空目錄項中;</p><p> ?、?為新文件填寫①中分配到的空閑打開文件表項,fcbstate字段值為0,讀寫指針值為0;</p><p> ?、?調(diào)用my_close()關(guān)閉②中打開的父目錄文件;</p><p> ?、?將新文件的打開文件表項序號作為其文件描述符返回。</p>
37、;<p> 9.刪除文件函數(shù)my_rm()</p><p> ?。?)對應(yīng)命令:my_rm</p><p> (2)命令調(diào)用格式:my_rm filename</p><p> ?。?)函數(shù)設(shè)計格式:void my_rm(char *filename)</p><p> (4)功能:刪除名為filename的文件。<
38、/p><p><b> (5)輸入:</b></p><p> filename:欲刪除文件的文件名,可能還包含路徑。 </p><p><b> ?。?)輸出:無。</b></p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?若欲刪除文件
39、的父目錄文件還沒有打開,則調(diào)用my_open()打開;若打開失敗,則返回,并顯示錯誤信息;</p><p> ?、?調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下欲刪除文件是否存在,若不存在則返回,并顯示錯誤信息;</p><p> ?、?檢查該文件是否已經(jīng)打開,若已打開則關(guān)閉掉;</p><p> ?、?回收該文件所占據(jù)的磁盤塊,修改FAT;<
40、;/p><p> ?、?從文件的父目錄文件中清空該文件的目錄項,且free字段置為0:以覆蓋寫方式調(diào)用do_write()來實現(xiàn);;</p><p> ⑥ 修改該父目錄文件的用戶打開文件表項中的長度信息,并將該表項中的fcbstate置為1;</p><p><b> ⑦ 返回。</b></p><p> 10.打開文
41、件函數(shù)my_open()</p><p> ?。?)對應(yīng)命令:my_open</p><p> ?。?)命令調(diào)用格式:my_open filename</p><p> ?。?)函數(shù)設(shè)計格式:int my_open(char *filename)</p><p> ?。?)功能:打開當(dāng)前目錄下名為filename的文件。</p>
42、<p><b> ?。?)輸入:</b></p><p> filename:欲打開文件的文件名 </p><p> (6)輸出:若打開成功,返回該文件的描述符(在用戶打開文件表中表項序號);否則返回-1。</p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?檢查該文件
43、是否已經(jīng)打開,若已打開則返回-1,并顯示錯誤信息;</p><p> ?、?調(diào)用do_read()讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲打開文件是否存在,若不存在則返回-1,并顯示錯誤信息;</p><p> ?、?檢查用戶打開文件表中是否有空表項,若有則為欲打開文件分配一個空表項,若沒有則返回-1,并顯示錯誤信息;</p><p> ④ 為該文件填寫空白用戶
44、打開文件表表項內(nèi)容,讀寫指針置為0;</p><p> ?、?將該文件所分配到的空白用戶打開文件表表項序號(數(shù)組下標(biāo))作為文件描述符fd返回。</p><p> 11.關(guān)閉文件函數(shù)my_close()</p><p> ?。?)對應(yīng)命令:my_close</p><p> (2)命令調(diào)用格式:my_close fd</p>
45、<p> ?。?)函數(shù)設(shè)計格式:void my_close(int fd)</p><p> ?。?)功能:關(guān)閉前面由my_open()打開的文件描述符為fd的文件。</p><p><b> (5)輸入:</b></p><p> fd:文件描述符。 </p><p><b>
46、 ?。?)輸出:無。</b></p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?檢查fd的有效性(fd不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)),如果無效則返回-1;</p><p> ?、?檢查用戶打開文件表表項中的fcbstate字段的值,如果為1則需要將該文件的FCB的內(nèi)容保存到虛擬磁盤上該文件的目錄項中,方法是:打開該文件的父
47、目錄文件,以覆蓋寫方式調(diào)用do_write()將欲關(guān)閉文件的FCB寫入父目錄文件的相應(yīng)盤塊中; </p><p> ?、?回收該文件占據(jù)的用戶打開文件表表項(進(jìn)行清空操作),并將topenfile字段置為0; </p><p><b> ?、?返回。</b></p><p> 12.寫文件函數(shù)my_write() </p>&
48、lt;p> (1)對應(yīng)命令:my_write</p><p> ?。?)命令調(diào)用格式:my_write fd</p><p> ?。?)函數(shù)設(shè)計格式:int my_write(int fd)</p><p> ?。?)功能:將用戶通過鍵盤輸入的內(nèi)容寫到fd所指定的文件中。磁盤文件的讀寫操作都必須以完整的數(shù)據(jù)塊為單位進(jìn)行,在寫操作時,先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖
49、區(qū)的大小與磁盤塊的大小相同,然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出時先將一個磁盤塊中的內(nèi)容讀到緩沖區(qū)中,然后再傳送到用戶區(qū)。本實例為了簡便起見,沒有設(shè)置緩沖區(qū)管理,只是在讀寫文件時由用戶使用malloc()申請一塊空間作為緩沖區(qū),讀寫操作結(jié)束后使用free()釋放掉。</p><p> 寫操作常有三種方式:截斷寫、覆蓋寫和追加寫。截斷寫是放棄原來文件的內(nèi)容,重新寫文件;覆蓋寫是修改文件在當(dāng)前讀寫指針?biāo)?/p>
50、的位置開始的部分內(nèi)容;追加寫是在原文件的最后添加新的內(nèi)容。在本實例中,輸入寫文件命令后,系統(tǒng)會出現(xiàn)提示讓用戶選擇其中的一種寫方式,并將隨后鍵盤輸入的內(nèi)容按照所選的方式寫到文件中,鍵盤輸入內(nèi)容通過CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束。</p><p><b> ?。?)輸入:</b></p><p> fd: open()函數(shù)的返回值,文件的描述符; <
51、;/p><p> (6)輸出:實際寫入的字節(jié)數(shù)。</p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?檢查fd的有效性(fd不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)),如果無效則返回-1,并顯示出錯信息;</p><p> ?、?提示并等待用戶輸入寫方式:(1:截斷寫;2:覆蓋寫;3:追加寫)</p><p
52、> ③ 如果用戶要求的寫方式是截斷寫,則釋放文件除第一塊外的其他磁盤空間內(nèi)容(查找并修改FAT表),將內(nèi)存用戶打開文件表項中文件長度修改為0,將讀寫指針置為0并轉(zhuǎn)④;如果用戶要求的寫方式是追加寫,則修改文件的當(dāng)前讀寫指針位置到文件的末尾,并轉(zhuǎn)④;如果寫方式是覆蓋寫,則直接轉(zhuǎn)④;</p><p> ?、?提示用戶:整個輸入內(nèi)容通過CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束;用戶可分多次輸入寫入內(nèi)容,每次用回車結(jié)束;
53、</p><p> ?、?等待用戶從鍵盤輸入文件內(nèi)容,并將用戶的本次輸入內(nèi)容保存到一臨時變量text[]中,要求每次輸入以回車結(jié)束,全部結(jié)束用CTR+Z鍵(或其他設(shè)定的鍵);</p><p> ?、?調(diào)用do_write()函數(shù)將通過鍵盤鍵入的內(nèi)容寫到文件中。</p><p> ⑦ 如果do_write()函數(shù)的返回值為非負(fù)值,則將實際寫入字節(jié)數(shù)增加do_writ
54、e()函數(shù)返回值,否則顯示出錯信息,并轉(zhuǎn)⑨;</p><p> ⑧ 如果text[]中最后一個字符不是結(jié)束字符CTR+Z,則轉(zhuǎn)⑦繼續(xù)進(jìn)行寫操作;否則轉(zhuǎn)⑨;</p><p> ⑨ 如果當(dāng)前讀寫指針位置大于用戶打開文件表項中的文件長度,則修改打開文件表項中的文件長度信息,并將fcbstate置1;</p><p> ?、?返回實際寫入的字節(jié)數(shù)。</p>
55、<p> 13.實際寫文件函數(shù)do_write() </p><p><b> ?。?)對應(yīng)命令:無</b></p><p> ?。?)命令調(diào)用格式:無</p><p> ?。?)函數(shù)設(shè)計格式:int my_write(int fd,char *text,int len,char wstyle)</p><p
56、> ?。?)功能:被寫文件函數(shù)my_write()調(diào)用,用來將鍵盤輸入的內(nèi)容寫到相應(yīng)的文件中去。</p><p><b> ?。?)輸入:</b></p><p> fd: open()函數(shù)的返回值,文件的描述符; </p><p> text:指向要寫入的內(nèi)容的指針;</p><p> len:本次要求寫
57、入字節(jié)數(shù) </p><p> wstyle:寫方式</p><p> ?。?)輸出:實際寫入的字節(jié)數(shù)。</p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?用malloc()申請1024B的內(nèi)存空間作為讀寫磁盤的緩沖區(qū)buf,申請失敗則返回-1,并顯示出錯信息;</p><p> ?、?將讀
58、寫指針轉(zhuǎn)化為邏輯塊塊號和塊內(nèi)偏移off,并利用打開文件表表項中的首塊號及FAT表的相關(guān)內(nèi)容將邏輯塊塊號轉(zhuǎn)換成對應(yīng)的磁盤塊塊號blkno;如果找不到對應(yīng)的磁盤塊,則需要檢索FAT為該邏輯塊分配一新的磁盤塊,并將對應(yīng)的磁盤塊塊號blkno登記到FAT中,若分配失敗,則返回-1,并顯示出錯信息;</p><p> ?、?如果是覆蓋寫,或者如果當(dāng)前讀寫指針?biāo)鶎?yīng)的塊內(nèi)偏移off不等于0,則將塊號為blkno的虛擬磁盤塊全
59、部1024B的內(nèi)容讀到緩沖區(qū)buf中;否則便用ASCII碼0清空buf;</p><p> ?、?將text中未寫入的內(nèi)容暫存到緩沖區(qū)buff的第off字節(jié)開始的位置,直到緩沖區(qū)滿,或者接收到結(jié)束字符CTR+Z為止;將本次寫入字節(jié)數(shù)記錄到tmplen中;</p><p> ?、?將buf中1024B的內(nèi)容寫入到塊號為blkno的虛擬磁盤塊中;</p><p> ?、?/p>
60、將當(dāng)前讀寫指針修改為原來的值加上tmplen;并將本次實際寫入的字節(jié)數(shù)增加tmplen;</p><p> ⑦ 如果tmplen小于len,則轉(zhuǎn)②繼續(xù)寫入;否則轉(zhuǎn)⑧;</p><p> ⑧ 返回本次實際寫入的字節(jié)數(shù)。</p><p> 14.讀文件函數(shù)my_read() </p><p> ?。?)對應(yīng)命令:my_read</p
61、><p> ?。?)命令調(diào)用格式:my_read fd len</p><p> ?。?)函數(shù)設(shè)計格式:int myread (int fd, int len)</p><p> ?。?)功能:讀出指定文件中從讀寫指針開始的長度為len的內(nèi)容到用戶空間中。</p><p><b> ?。?)輸入:</b></p>
62、<p> fd: open()函數(shù)的返回值,文件的描述符;</p><p> len: 要從文件中讀出的字節(jié)數(shù)。 </p><p> (6)輸出:實際讀出的字節(jié)數(shù)。</p><p> ?。?)函數(shù)需完成的工作:</p><p> ?、?定義一個字符型數(shù)組text[len],用來接收用戶從文件中讀出的文件
63、內(nèi)容; </p><p> ?、?檢查fd的有效性(fd不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)),如果無效則返回-1,并顯示出錯信息;</p><p> ?、?調(diào)用do_read()將指定文件中的len字節(jié)內(nèi)容讀出到text[]中;</p><p> ?、?如果do_read()的返回值為負(fù),則顯示出錯信息;否則將text[]中的內(nèi)容顯示到屏幕上;</p&g
64、t;<p><b> ?、?返回。</b></p><p> 15.實際讀文件函數(shù)do_read() </p><p><b> ?。?)對應(yīng)命令:無</b></p><p> ?。?)命令調(diào)用格式:無</p><p> ?。?)函數(shù)設(shè)計格式:int do_read (int fd
65、, int len,char *text)</p><p> ?。?)功能:被my_read()調(diào)用,讀出指定文件中從讀寫指針開始的長度為len的內(nèi)容到用戶空間的text中。</p><p><b> (5)輸入:</b></p><p> fd: open()函數(shù)的返回值,文件的描述符;</p><p> le
66、n: 要求從文件中讀出的字節(jié)數(shù)。 </p><p> text:指向存放讀出數(shù)據(jù)的用戶區(qū)地址</p><p> ?。?)輸出:實際讀出的字節(jié)數(shù)。</p><p> (7)函數(shù)需完成的工作:</p><p> ?、?使用malloc()申請1024B空間作為緩沖區(qū)buf,申請失敗則返回-1,并顯示出錯信息;</p&g
67、t;<p> ② 將讀寫指針轉(zhuǎn)化為邏輯塊塊號及塊內(nèi)偏移量off,利用打開文件表表項中的首塊號查找FAT表,找到該邏輯塊所在的磁盤塊塊號;將該磁盤塊塊號轉(zhuǎn)化為虛擬磁盤上的內(nèi)存位置;</p><p> ?、?將該內(nèi)存位置開始的1024B(一個磁盤塊)內(nèi)容讀入buf中;</p><p> ?、?比較buf中從偏移量off開始的剩余字節(jié)數(shù)是否大于等于應(yīng)讀寫的字節(jié)數(shù)len,如果是,則
68、將從off開始的buf中的len長度的內(nèi)容讀入到text[]中;否則,將從off開始的buf中的剩余內(nèi)容讀入到text[]中;</p><p> ⑤ 將讀寫指針增加④中已讀字節(jié)數(shù),將應(yīng)讀寫的字節(jié)數(shù)len減去④中已讀字節(jié)數(shù),若len大于0,則轉(zhuǎn)②;否則轉(zhuǎn)⑥;</p><p> ?、?使用free()釋放①中申請的buf。</p><p> ⑦ 返回實際讀出的字節(jié)數(shù)
69、。</p><p> 16. 退出文件系統(tǒng)函數(shù)my_exitsys() </p><p> ?。?)對應(yīng)命令:my_exitsys</p><p> (2)命令調(diào)用格式:my_ exitsys</p><p> ?。?)函數(shù)設(shè)計格式:void my_exitsys()</p><p> (2)功能:退出文件系統(tǒng)
70、。</p><p> ?。?)輸入:無 </p><p><b> (4)輸出:無。</b></p><p> (5)函數(shù)需完成的工作:</p><p> ?、?使用C庫函數(shù)fopen()打開磁盤上的myfsys文件;</p><p> ?、?將虛擬磁盤空間中的所有內(nèi)容保存到磁盤上的myf
71、sys文件中;</p><p> ?、?使用c語言的庫函數(shù)fclose()關(guān)閉myfsys文件;</p><p> ④ 撤銷用戶打開文件表,釋放其內(nèi)存空間</p><p> ?、?釋放虛擬磁盤空間。</p><p><b> 流程圖</b></p><p><b> 是</b
72、></p><p><b> 否</b></p><p><b> 等待用戶命令輸入</b></p><p><b> ……</b></p><p><b> 程序?qū)崿F(xiàn)代碼:</b></p><p> #includ
73、e <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p><p> #include <time.h></p><p> #define BLOCKSIZE 1024 // 磁盤塊大小</p
74、><p> #define SIZE 1024000 // 虛擬磁盤空間大小</p><p> #define END 65535 // FAT中的文件結(jié)束標(biāo)志</p><p> #define FREE 0 // FAT中盤塊空閑標(biāo)志</p><p> #define ROOTBLOCKNUM 2 // 根目錄區(qū)所占盤塊數(shù)<
75、;/p><p> #define MAXOPENFILE 10 // 最多同時打開文件個數(shù)t</p><p> #define MAXTEXT 10000</p><p> /* 文件控制塊 */</p><p> typedef struct FCB{</p><p> char filename[8];
76、// 文件名</p><p> char exname[3]; // 文件擴(kuò)展名</p><p> unsigned char attribute; // 文件屬性字段,值為0時表示目錄文件,值為1時表示數(shù)據(jù)文件</p><p> unsigned short time; // 文件創(chuàng)建時間</p><p> unsigned
77、short date; // 文件創(chuàng)建日期</p><p> unsigned short first; // 文件起始盤塊號</p><p> unsigned long length; // 文件長度</p><p> char free; // 表示目錄項是否為空,若值為0,表示空,值為1,表示已分配</p><p>&l
78、t;b> }fcb;</b></p><p> /* 文件分配表 */</p><p> typedef struct FAT</p><p><b> {</b></p><p> unsigned short id; // 磁盤塊的狀態(tài)(空閑的,最后的,下一個)</p>&
79、lt;p><b> }fat;</b></p><p> /* 用戶打開文件表 */</p><p> typedef struct USEROPEN</p><p><b> {</b></p><p> char filename[8]; // 文件名</p>&
80、lt;p> char exname[3]; // 文件擴(kuò)展名</p><p> unsigned char attribute;//文件屬性字段,值為0時表示目錄文件,值為1時表示數(shù)據(jù)文件</p><p> unsigned short time; // 文件創(chuàng)建時間</p><p> unsigned short date; // 文件創(chuàng)建日期
81、</p><p> unsigned short first; // 文件起始盤塊號</p><p> unsigned long length;//文件長度(對數(shù)據(jù)文件是字節(jié)數(shù),對目錄文件可以是目錄項個數(shù))</p><p> char free; // 表示目錄項是否為空,若值為0,表示空,值為1,表示已分配</p><p>
82、unsigned short dirno; // 相應(yīng)打開文件的目錄項在父目錄文件中的盤塊號</p><p> int diroff; // 相應(yīng)打開文件的目錄項在父目錄文件的dirno盤塊中的目錄項序號</p><p> char dir[80]; // 相應(yīng)打開文件所在的路徑名,這樣方便快速檢查出指定文件是否已經(jīng)打開</p><p> int fat
83、her; // 父目錄在打開文件表項的位置</p><p> int count; // 讀寫指針在文件中的位置,文件的總字符數(shù)</p><p> char fcbstate; // 是否修改了文件的FCB的內(nèi)容,如果修改了置為1,否則為0</p><p> char topenfile; // 表示該用戶打開表項是否為空,若值為0,表示為空,否則表示
84、已被某打開文件占據(jù)</p><p> }useropen;</p><p><b> /* 引導(dǎo)塊 */</b></p><p> typedef struct BLOCK0</p><p><b> {</b></p><p> char magic[10];
85、// 文件系統(tǒng)魔數(shù)</p><p> char information[200];//存儲一些描述信息,如磁盤塊大小、磁盤塊數(shù)量、最多打開文件數(shù)等</p><p> unsigned short root; // 根目錄文件的起始盤塊號</p><p> unsigned char *startblock; // 虛擬磁盤上數(shù)據(jù)區(qū)開始位置</p>
86、;<p><b> }block0;</b></p><p> unsigned char *myvhard; // 指向虛擬磁盤的起始地址</p><p> useropen openfilelist[MAXOPENFILE]; // 用戶打開文件表數(shù)組</p><p> int curdir; // 用戶打開文件
87、表中的當(dāng)前目錄所在打開文件表項的位置</p><p> char currentdir[80]; // 記錄當(dāng)前目錄的目錄名(包括目錄的路徑)</p><p> unsigned char* startp; // 記錄虛擬磁盤上數(shù)據(jù)區(qū)開始位置</p><p> char myfilename[] = "myfilesys";//文件系統(tǒng)
88、的文件名</p><p> void startsys(); // 進(jìn)入文件系統(tǒng)</p><p> void my_format(); // 磁盤格式化</p><p> void my_cd(char *dirname); // 更改當(dāng)前目錄</p><p> void my_mkdir(char *dirname); //
89、 創(chuàng)建子目錄</p><p> void my_rmdir(char *dirname); // 刪除子目錄</p><p> void my_ls(); // 顯示目錄</p><p> void my_create (char *filename); // 創(chuàng)建文件</p><p> void my_rm(char *fil
90、ename); // 刪除文件</p><p> int my_open(char *filename); // 打開文件</p><p> int my_close(int fd); // 關(guān)閉文件</p><p> int my_write(int fd); // 寫文件</p><p> int do_write(int
91、 fd, char *text, int len, char wstyle); // 實際寫文件</p><p> int my_read (int fd, int len); // 讀文件</p><p> int do_read (int fd, int len,char *text); // 實際讀文件</p><p> void my_exits
92、ys(); // 退出文件系統(tǒng)</p><p> unsigned short findblock(); // 尋找空閑盤塊</p><p> int findopenfile(); // 尋找空閑文件表項</p><p> void startsys()</p><p><b> {</b></p&
93、gt;<p><b> FILE *fp;</b></p><p> unsigned char buf[SIZE];</p><p> fcb *root;</p><p><b> int i;</b></p><p> myvhard = (unsigned char
94、*)malloc(SIZE);//申請?zhí)摂M磁盤空間</p><p> memset(myvhard, 0, SIZE);//將myvhard中前SIZE個字節(jié)用 0 替換并返回 myvhard</p><p> if((fp = fopen(myfilename, "r")) != NULL)</p><p><b> {<
95、/b></p><p> fread(buf, SIZE, 1, fp);//將二進(jìn)制文件讀取到緩沖區(qū)</p><p> fclose(fp);</p><p> if(strcmp(((block0 *)buf)->magic, "10101010"))</p><p><b> {<
96、/b></p><p> printf("myfilesys is not exist,begin to creat the file...\n");</p><p> my_format();</p><p><b> }</b></p><p><b> else</
97、b></p><p><b> {</b></p><p> for(i = 0; i < SIZE; i++)</p><p> myvhard[i] = buf[i];</p><p><b> }</b></p><p><b> }&l
98、t;/b></p><p><b> else</b></p><p><b> {</b></p><p> printf("myfilesys is not exist,begin to creat the file...\n");</p><p> my_fo
99、rmat();</p><p><b> }</b></p><p> root = (fcb *)(myvhard + 5 * BLOCKSIZE);</p><p> strcpy(openfilelist[0].filename, root->filename);</p><p> strcpy(op
100、enfilelist[0].exname, root->exname);</p><p> openfilelist[0].attribute = root->attribute;</p><p> openfilelist[0].time = root->time;</p><p> openfilelist[0].date = root-
101、>date;</p><p> openfilelist[0].first = root->first;</p><p> openfilelist[0].length = root->length;</p><p> openfilelist[0].free = root->free;</p><p> op
102、enfilelist[0].dirno = 5;</p><p> openfilelist[0].diroff = 0;</p><p> strcpy(openfilelist[0].dir, "\\root\\");</p><p> openfilelist[0].father = 0;</p><p>
103、openfilelist[0].count = 0;</p><p> openfilelist[0].fcbstate = 0;</p><p> openfilelist[0].topenfile = 1;</p><p> for(i = 1; i < MAXOPENFILE; i++)</p><p> openfile
104、list[i].topenfile = 0;</p><p> curdir = 0;</p><p> strcpy(currentdir, "\\root\\");</p><p> startp = ((block0 *)myvhard)->startblock;</p><p><b> }
105、</b></p><p> void my_format()</p><p><b> {</b></p><p><b> FILE *fp;</b></p><p> fat *fat1, *fat2;</p><p> block0 *blk0;&
106、lt;/p><p> time_t now;</p><p> struct tm *nowtime;</p><p> fcb *root;</p><p><b> int i;</b></p><p> blk0 = (block0 *)myvhard;</p><
107、p> fat1 = (fat *)(myvhard + BLOCKSIZE);</p><p> fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);</p><p> root = (fcb *)(myvhard + 5 * BLOCKSIZE);</p><p> strcpy(blk0->magic, "
108、;10101010");</p><p> strcpy(blk0->information, "My FileSystem Ver 1.0 \n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2\n");</p><p> blk0->root = 5;</p>
109、;<p> blk0->startblock = (unsigned char *)root;</p><p> for(i = 0; i < 5; i++)</p><p><b> {</b></p><p> fat1->id = END;</p><p> fat2-&g
110、t;id = END;</p><p><b> fat1++;</b></p><p><b> fat2++;</b></p><p><b> }</b></p><p> fat1->id = 6;</p><p> fat2-&
111、gt;id = 6;</p><p><b> fat1++;</b></p><p><b> fat2++;</b></p><p> fat1->id = END;</p><p> fat2->id = END;</p><p><b>
112、 fat1++;</b></p><p><b> fat2++;</b></p><p> for(i = 7; i < SIZE / BLOCKSIZE; i++)</p><p><b> {</b></p><p> fat1->id = FREE;<
113、/p><p> fat2->id = FREE;</p><p><b> fat1++;</b></p><p><b> fat2++;</b></p><p><b> }</b></p><p> now = time(NULL);&
114、lt;/p><p> nowtime = localtime(&now);</p><p> strcpy(root->filename, ".");</p><p> strcpy(root->exname, "");</p><p> root->attribute =
115、 0x28;</p><p> root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;</p><p> root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1
116、) * 32 + nowtime->tm_mday;</p><p> root->first = 5;</p><p> root->length = 2 * sizeof(fcb);</p><p> root->free = 1;</p><p><b> root++;</b>&l
117、t;/p><p> now = time(NULL);</p><p> nowtime = localtime(&now);</p><p> strcpy(root->filename, "..");</p><p> strcpy(root->exname, "");<
118、;/p><p> root->attribute = 0x28;</p><p> root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;</p><p> root->date = (nowtime->tm_ye
119、ar - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday;</p><p> root->first = 5;</p><p> root->length = 2 * sizeof(fcb);</p><p> root->free = 1;</p>
120、<p> fp = fopen(myfilename, "w");</p><p> fwrite(myvhard, SIZE, 1, fp);</p><p> fclose(fp);</p><p><b> }</b></p><p> void my_cd(char *d
121、irname)</p><p><b> {</b></p><p> char *dir;</p><p><b> int fd;</b></p><p> dir = strtok(dirname, "\\");//分解字符串為一組字符串。dirname為要分解的字
122、符串,"\\"為分隔符字符串</p><p> if(strcmp(dir, ".") == 0)</p><p><b> return;</b></p><p> else if(strcmp(dir, "..") == 0)</p><p><
123、b> {</b></p><p> if(curdir)</p><p> curdir = my_close(curdir);</p><p><b> return;</b></p><p><b> }</b></p><p> else
124、if(strcmp(dir, "root") == 0)</p><p><b> {</b></p><p> while(curdir)</p><p> curdir = my_close(curdir);</p><p> dir = strtok(NULL, "\\&quo
125、t;);</p><p><b> }</b></p><p> while(dir)</p><p><b> {</b></p><p> fd = my_open(dir);</p><p> if(fd != -1)</p><p>
126、 curdir = fd;</p><p><b> else</b></p><p><b> return;</b></p><p> dir = strtok(NULL, "\\");</p><p><b> }</b></p>
127、<p><b> }</b></p><p> void my_mkdir(char *dirname)</p><p><b> {</b></p><p> fcb *fcbptr;</p><p> fat *fat1, *fat2;</p><p&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--簡單文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--簡單二級文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計與實現(xiàn)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--虛擬文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(文件系統(tǒng)管理)
- 操作系統(tǒng)課程設(shè)計----二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--多用戶多級目錄文件系統(tǒng)實現(xiàn)
- 操作系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計---多用戶多級目錄文件系統(tǒng)的實現(xiàn)
評論
0/150
提交評論