版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 設(shè)計(jì)時(shí)間: 2011-1-5至2011-1-7 </p><p><b> 一.設(shè)計(jì)目的:</b></p><p> 通過操作系統(tǒng)內(nèi)其中一個(gè)子系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),掌握Linux文件系統(tǒng)的基本原理、結(jié)構(gòu)和實(shí)現(xiàn)方法,掌握Linux文件系統(tǒng)中文件的建立、打開、讀/寫、執(zhí)行、屬性等系統(tǒng)調(diào)用的使用,學(xué)會(huì)設(shè)計(jì)簡單的文件系統(tǒng)并實(shí)現(xiàn)一組操作,以及學(xué)習(xí)文件
2、系統(tǒng)的系統(tǒng)調(diào)用命令,提高對(duì)文件系統(tǒng)實(shí)現(xiàn)功能的理解和掌握。同時(shí),掌握操作系統(tǒng)設(shè)計(jì)的方法與技巧,增強(qiáng)系統(tǒng)軟件設(shè)計(jì)的實(shí)際工作能力。</p><p><b> 二.設(shè)計(jì)內(nèi)容:</b></p><p> 為LINUX 設(shè)計(jì)一個(gè)簡單的二級(jí)文件系統(tǒng)。本文件系統(tǒng)采用類似DOS系統(tǒng)的文件管理方式,每次調(diào)用該文件系統(tǒng)時(shí),首先申請(qǐng)一定的內(nèi)存空間,然后對(duì)該內(nèi)存空間進(jìn)行分配。將申請(qǐng)到的空間
3、劃分為目錄區(qū),文件區(qū);采用位示圖進(jìn)行空間管理,盤塊的分配使用顯示鏈接(FAT表)的方式。每次調(diào)用該文件系統(tǒng)時(shí)自動(dòng)為其分配空間,并將上次操作的結(jié)果從硬盤上調(diào)入內(nèi)存;當(dāng)結(jié)束調(diào)用時(shí)則將操作的結(jié)果重新存入硬盤,以便下次調(diào)用。(每次使用都會(huì)自動(dòng)搜索文件系統(tǒng),以此確定是否是第一次使用;若是則格式化生成文件系統(tǒng),否則讀取已存在的文件系統(tǒng)。)</p><p><b> 三.設(shè)計(jì)過程</b></p&g
4、t;<p><b> 實(shí)現(xiàn)功能</b></p><p> 該系統(tǒng)具備下列功能:</p><p> login 用戶登錄 logout 注銷</p><p> mkdir/md 創(chuàng)建目錄 rmdir/rd 刪除目錄</p><p> cd/cd .. 修改目錄
5、creat 創(chuàng)建文件</p><p> open 打開文件dir 顯示當(dāng)前目錄和文件</p><p> write 讀文件 delete 刪除文件</p><p> close 關(guān)閉文件</p><p><b> 添加功能</b>
6、</p><p> 制作了一個(gè)“操作命令符”列表框,說明接下來如何操作,這樣有利于更好地閱讀、操作和運(yùn)行程序,使不懂得程序代碼的人也可以運(yùn)行該程序,更好地理解該程序?qū)崿F(xiàn)的功能。</p><p> 在命令解釋層函數(shù)cmdexp()里加了一些選擇和操作功能,增加程序?qū)崿F(xiàn)的功能,如原來程序只有顯示當(dāng)前目錄和文件、創(chuàng)建目錄和修改目錄的功能,把它拓展到系統(tǒng)所要求的全部功能,并在原有的程序的基礎(chǔ)上
7、進(jìn)行相應(yīng)的修改,使程序更加完善。</p><p><b> 設(shè)計(jì)思路</b></p><p> ?。?) 要將文件存儲(chǔ)在磁盤上,必須為之分配相應(yīng)的存儲(chǔ)空間,并對(duì)文件存儲(chǔ)空間進(jìn)行管理,為了簡化對(duì)文件的訪問和共享,還應(yīng)設(shè)置相應(yīng)的用戶文件描述表及文件表。</p><p><b> ?、傥募淼慕M織</b></p>
8、<p> UNIX中,把每個(gè)磁盤(帶)看作是一個(gè)文件卷,每個(gè)文件卷上可存放一個(gè)具有獨(dú)立目錄結(jié)構(gòu)的文件系統(tǒng)。一個(gè)文件卷包含許多物理塊,并按塊號(hào)排列如下圖:</p><p> 其中,0#塊用于系統(tǒng)引導(dǎo)或空閑,1#為超級(jí)塊(superblock),存放文件卷的資源管理信息,如整個(gè)文件卷的盤塊數(shù)、磁盤索引結(jié)點(diǎn)的盤塊數(shù)、空閑盤塊號(hào)棧及指針等。2#~K#存放磁盤索引結(jié)點(diǎn)。每個(gè)索引結(jié)點(diǎn)64B,第K+1#~N#存
9、放文件數(shù)據(jù)。</p><p><b> ?、诳臻e盤塊的組織</b></p><p> UNIX采用成組鏈接法組織空閑盤塊。它將若干個(gè)空閑盤塊劃歸一個(gè)組,將每組中所有盤塊號(hào)存放在其前一組的第一個(gè)空閑盤塊中,而第一組中所有空閑盤塊號(hào)放入超級(jí)塊的空閑盤塊號(hào)棧中。</p><p> 例: 超級(jí)塊表<
10、;/p><p> ③空閑盤塊的分配與回收</p><p> 內(nèi)核要從文件系統(tǒng)中分配一盤塊時(shí),先檢查超級(jí)塊空閑盤塊號(hào)棧是否已上鎖。是則調(diào)用sleep睡眠,否則將超級(jí)塊中空閑盤塊棧棧頂盤塊號(hào)分配出去。</p><p> 回收時(shí),若空閑盤塊號(hào)棧未滿,直接將回收盤塊編號(hào)記入空閑盤塊號(hào)棧中。若回收時(shí)棧已滿,須先將棧中的所有空閑盤塊號(hào)復(fù)制到新回收的盤塊中,再將新回收盤塊的編號(hào)
11、作為新棧的棧底塊號(hào)進(jìn)棧。</p><p> (2) UNIX中,為了加速對(duì)文件目錄的查找,將文件名和文件說明分開,由文件說明形成一個(gè)稱為索引結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu),而相應(yīng)的文件目錄項(xiàng)則只由文件符號(hào)名和指向索引結(jié)點(diǎn)的指針構(gòu)成。對(duì)目錄的管理應(yīng)包括的功能有:</p><p> ①對(duì)索引結(jié)點(diǎn)的管理:每個(gè)文件都有一唯一的磁盤索引結(jié)點(diǎn)(di_node)。文件被打開后,還有一個(gè)內(nèi)存索引結(jié)點(diǎn)(i_node)。
12、創(chuàng)建一新文件時(shí),就為之建立一個(gè)磁盤索引結(jié)點(diǎn),以將文件的有關(guān)信息記入其中,并將用戶提供的文件名和磁盤索引結(jié)點(diǎn)號(hào)一并組成一個(gè)新目錄項(xiàng),記入其父目錄文件中。文件被撤消時(shí),系統(tǒng)要回收該文件的磁盤索引結(jié)點(diǎn),從其父目錄中刪除該目錄項(xiàng)。隨著文件的打開與關(guān)閉,系統(tǒng)還要為之分配和回收內(nèi)存索引結(jié)點(diǎn)。</p><p> ?、诖疟P索引結(jié)點(diǎn)中,包含有關(guān)文件的下述一系列信息:文件模式di_mode、文件所有者用戶標(biāo)識(shí)符di_uid、同組用戶
13、標(biāo)識(shí)符di_gid、文件長度di_size、文件的聯(lián)接計(jì)數(shù)di_nlink、文件的物理地址di_addr、文件的訪問時(shí)間di_atime、文件的修改時(shí)間di_mtime和文件的建立時(shí)間di_citime。</p><p> ?、蹆?nèi)存索引結(jié)點(diǎn):文件被打開后,系統(tǒng)為它在內(nèi)存索引結(jié)點(diǎn)表區(qū)中建一內(nèi)存索引結(jié)點(diǎn),以方便用戶和系統(tǒng)對(duì)文件的訪問。</p><p> ?、艽疟P索引結(jié)點(diǎn)的分配與回收</p
14、><p> 分配過程ialloc:當(dāng)內(nèi)核創(chuàng)建一新文件時(shí),要為之分配一空閑磁盤i結(jié)點(diǎn)。如分配成功,便再分配一內(nèi)存i結(jié)點(diǎn)。其過程如下:檢查超級(jí)塊上鎖否。由于超級(jí)塊是臨界資源,諸進(jìn)程必須互斥地訪問它,故在進(jìn)入ialloc后,要先檢查它是否已上鎖,若是則睡眠等待;</p><p> 檢查i結(jié)點(diǎn)??辗瘛H鬷結(jié)點(diǎn)棧中已無空閑結(jié)點(diǎn)編號(hào),則應(yīng)從盤中再調(diào)入一批i結(jié)點(diǎn)號(hào)進(jìn)棧。若盤中已無空閑i結(jié)點(diǎn),則出錯(cuò)處理,
15、返回;從空閑i結(jié)點(diǎn)編號(hào)棧中分配一i結(jié)點(diǎn),并對(duì)它初始化、填寫有關(guān)文件的屬性;分配內(nèi)存i結(jié)點(diǎn);將磁盤i結(jié)點(diǎn)總數(shù)-1,置超級(jí)塊修改標(biāo)志,返回。</p><p> 回收過程ifree:當(dāng)刪除文件時(shí),應(yīng)回收其所占用的盤塊及相應(yīng)的磁盤i結(jié)點(diǎn)。具體有:檢查超級(jí)塊上鎖否。若是,直接返回,即不把本次回收的i結(jié)點(diǎn)號(hào)記入空閑i結(jié)點(diǎn)編號(hào)棧中;檢查i結(jié)點(diǎn)編號(hào)棧滿否。若已滿,無法再裝入新回收的i結(jié)點(diǎn)號(hào),立即返回,若未滿,便將回收的i結(jié)點(diǎn)編
16、號(hào)進(jìn)棧,并使當(dāng)前空閑結(jié)點(diǎn)數(shù)+1;置超級(jí)塊修改標(biāo)志,返回。</p><p> ?、輧?nèi)存索引結(jié)點(diǎn)的分配與回收</p><p> 分配過程iget:雖然iget用在打開文件時(shí)為之分配i結(jié)點(diǎn),但由于允許文件被共享,因此,如果一文件已被其他用戶打開并有了內(nèi)存i結(jié)點(diǎn),則此時(shí)只需將i結(jié)點(diǎn)中的引用計(jì)數(shù)+1。如果文件尚未被任何用戶(進(jìn)程)打開,則由iget過程為該文件分配一內(nèi)存i結(jié)點(diǎn),并調(diào)用bread過程
17、將其磁盤i結(jié)點(diǎn)的內(nèi)容拷貝到內(nèi)存i結(jié)點(diǎn)中并進(jìn)行初始化。</p><p> 回收過程iput:進(jìn)程要關(guān)閉某文件時(shí),須調(diào)用iput過程,先對(duì)該文件內(nèi)存i結(jié)點(diǎn)中的引用計(jì)數(shù)-1。若結(jié)果為0,便回收該內(nèi)存i結(jié)點(diǎn),再對(duì)該文件的磁盤i結(jié)點(diǎn)中的連接計(jì)數(shù)減1,若其結(jié)果也為0,便刪除此文件,并回收分配給該文件的盤塊和磁盤i結(jié)點(diǎn)。</p><p> ?。?)主要文件操作的處理過程</p><
18、p> ?、俅蜷_文件open:檢索目錄,內(nèi)核調(diào)用namei從根目錄或從當(dāng)前目錄,沿目錄樹查找指定的索引結(jié)點(diǎn)。若未找到或該文件不允許存取,則出錯(cuò)處理返回NULL,否則轉(zhuǎn)入下一步;分配內(nèi)存索引結(jié)點(diǎn),如果該文件已被其它用戶打開,只需對(duì)上一步中所找到的i結(jié)點(diǎn)引用計(jì)數(shù)+1,否則應(yīng)為被打開文件分配一內(nèi)存i結(jié)點(diǎn),并調(diào)用磁盤讀過程將磁盤i結(jié)點(diǎn)的內(nèi)容拷貝到內(nèi)存i結(jié)點(diǎn)中,并設(shè)置i.count=1;分配文件表項(xiàng),為已打開的文件分配一文件表項(xiàng),使表項(xiàng)中的f
19、.inode 指向內(nèi)存索引結(jié)點(diǎn);分配用戶文件描述表項(xiàng)。</p><p> ②創(chuàng)建文件creat:核心調(diào)用namei,從根目錄或當(dāng)前目錄開始,逐級(jí)向下查找指定的索引結(jié)點(diǎn)。此時(shí)有以下二種情況:重寫文件,namei找到了指定i結(jié)點(diǎn),調(diào)用free釋放原有文件的磁盤塊。此時(shí)內(nèi)核忽略用戶指定的許可權(quán)方式和所有者,而保持原有文件的存取權(quán)限方式和文件主。最后打開。新建,namei未找到。調(diào)用ialloc,為新創(chuàng)建的文件分配一磁
20、盤索引結(jié)點(diǎn),并將新文件名及所分配到的i結(jié)點(diǎn)編號(hào),寫入其父目錄中,建立一新目錄項(xiàng)。利用與open相同的方式,把新文件打開。</p><p> ?、坳P(guān)閉文件close:根據(jù)用戶文件描述符fd,從相應(yīng)的用戶文件描述符表項(xiàng)中,獲得指向文件表項(xiàng)的指針fp,再對(duì)該文件表項(xiàng)中的f.count-1。</p><p><b> 算法和流程圖</b></p><p&
21、gt; (1)部分主要的算法:</p><p><b> ?、僦骱瘮?shù):</b></p><p> #include <stdio.h></p><p> #include "filsys.h"</p><p> struct hinode hinode[NHINO];/* 查
22、找內(nèi)存i節(jié)點(diǎn)的hash表 */</p><p> struct filsys filsys;/* 超級(jí)塊數(shù)據(jù)結(jié)構(gòu) */</p><p> struct inode * cur_path_inode; /* 文件系統(tǒng)(內(nèi)存i節(jié)點(diǎn))數(shù)據(jù)結(jié)構(gòu) */</p><p> struct user user[USERNUM];
23、 /* 用戶打開表數(shù)據(jù)結(jié)構(gòu) */</p><p> struct file sys_ofile[SYSOPENFILE]; /* 系統(tǒng)打開表數(shù)據(jù)結(jié)構(gòu) */</p><p> struct direct cur_direct[NOFILE];/* 目錄數(shù)據(jù)結(jié)構(gòu)路徑 */</p><p> unsigned short cur_dir_id;
24、/* 當(dāng)前目錄指針 */</p><p> char cur_path_name[DIRSIZ];</p><p> FILE *fd; /* 本系統(tǒng)的所有文件指針 */</p><p> void main()</p><p><b> {</b>&l
25、t;/p><p> char reg_or_log; // 注冊(cè)/登錄變量名</p><p> char buf[50],buf2[50],buf3[50];</p><p><b> int i;</b></p><p> cur_dir_id = 0;</p><p> pri
26、ntf( "\n\t\tWelcome to this system!!!\n" );</p><p> printf( "initializing...\n" );</p><p> fd = fopen( "filesystem.dat", "r+b" );</p><p>
27、if( fd != NULL )/* 文件已經(jīng)存在,不用格式化 */</p><p><b> {</b></p><p> printf( "installing...\n" );</p><p> init();/* 讀取磁盤數(shù)據(jù) */</p><p><b&
28、gt; }</b></p><p> else/* 文件已經(jīng)存在,要進(jìn)行格式化 */</p><p><b> {</b></p><p> if( format() == 0 )/* 格式化 */</p><p> return;/* 格式化不成功 */<
29、;/p><p> printf( "installing...\n" );</p><p> init();/* 讀取磁盤數(shù)據(jù) */</p><p><b> }</b></p><p><b> AGAIN:</b></p><p>
30、 printf( "\nDo you want to register or login? (R/L) " );</p><p> while( 1 )</p><p><b> {</b></p><p> reg_or_log = getch();</p><p> /* 注冊(cè)新用戶 *
31、/</p><p> if(( reg_or_log == 'r' ) || ( reg_or_log == 'R' ))</p><p><b> {</b></p><p> printf( "%c\n", reg_or_log );</p><p><
32、b> reg();</b></p><p> goto AGAIN;</p><p><b> }</b></p><p> /* 登陸已有用戶 */</p><p> else if(( reg_or_log == 'l' ) || ( reg_or_log == '
33、;L' ))</p><p><b> {</b></p><p> printf( "%c\n", reg_or_log );</p><p> if( login() == 0) /* 登陸不成功 */</p><p> goto AGAIN;</p><
34、;p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> strcpy( cur_direct[cur_dir_id].d_name, "/" );</p><p>
35、cur_direct[cur_dir_id].d_ino = ROOTDIR;</p><p> strcpy( cur_path_name, "/" );</p><p> printf("\n \t操作命令符\n");</p><p> for (i=0; i<
36、=35; i++)</p><p> printf(" *");</p><p> printf("\n * ");</p><p> printf(" 1----dir/l/ls 顯示當(dāng)前目錄和文件 ");</p><p> printf("2----cd .
37、.退回到上一級(jí)目錄 ");</p><p> printf("*\n");</p><p> printf("\n * ");</p><p> printf(" 3----cd 文件名 顯示文件名目錄 ");</p><p> printf(&
38、quot;4----mkdir/md 文件名 創(chuàng)建目錄 ");</p><p> printf("*\n");</p><p> printf("\n * ");</p><p> printf(" 5----rmdir/rd 文件名 刪除目錄 ");</p>&
39、lt;p> printf("6----mkfile/mf 文件名 創(chuàng)建文件 ");</p><p> printf("*\n");</p><p> printf("\n * ");</p><p> printf(" 7----open 文件名 打開文件 &qu
40、ot;);</p><p> printf("8----write 文件名 寫文件 ");</p><p> printf("*\n");</p><p> printf("\n * ");</p><p> printf(" 9----read 文
41、件名 讀文件 ");</p><p> printf(" 10----close 文件名 關(guān)閉文件 ");</p><p> printf("*\n");</p><p> printf("\n * ");</p><p> printf
42、(" 11----delete 文件名 刪除文件 ");</p><p> printf(" 12----logout 注銷 ");</p><p> printf("*\n");</p><p> for (i=0; i<=35; i++)</p>
43、;<p> printf(" *");</p><p> printf("\n");</p><p><b> while(1)</b></p><p><b> {</b></p><p> if( cmdexp() == 1 )&l
44、t;/p><p><b> break;</b></p><p><b> }</b></p><p><b> halt();</b></p><p><b> }</b></p><p><b> ?、诿罱忉寣雍?/p>
45、數(shù):</b></p><p> #include <stdio.h></p><p> #include <string.h></p><p> #include "filsys.h"</p><p> char input_buf[20];/* 命令行輸入緩沖區(qū) */<
46、/p><p> static char str[20];</p><p> int over;/* 命令行結(jié)束標(biāo)記 */</p><p><b> int fd1;</b></p><p><b> int i,j;</b></p><p>
47、/* 命令解釋層函數(shù) */</p><p> int cmdexp()</p><p><b> {</b></p><p><b> over = 0;</b></p><p> printf("[%s@localhost%s]$ ", user[user_id].u_
48、name, cur_path_name);</p><p><b> getcmd();</b></p><p> /* 顯示當(dāng)前目錄 */</p><p> if(( strcmp( input_buf, "dir" ) == 0 ) || ( strcmp( input_buf, "l" ) =
49、= 0 ) || ( strcmp( input_buf, "ls" ) == 0 ))</p><p><b> {</b></p><p><b> _dir();</b></p><p> clearbuf();</p><p><b> return 0
50、;</b></p><p><b> }</b></p><p> /* 改變當(dāng)前目錄 */</p><p> if( strcmp( input_buf, "cd" ) == 0 )</p><p><b> {</b></p><p&g
51、t; getcmd(); /* 取得命令 */</p><p> chdir ( input_buf ); //改變當(dāng)前目錄用函數(shù)</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p>
52、<p> /* 創(chuàng)建目錄(建立子目錄) */</p><p> if(( strcmp( input_buf, "mkdir" ) == 0 ) ||( strcmp( input_buf, "md" ) == 0 ))</p><p><b> {</b></p><p> if(
53、over )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趍kdir后輸入要?jiǎng)?chuàng)建的目錄名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p>
54、<b> }</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] == '\0' )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趍kdir后輸入
55、要?jiǎng)?chuàng)建的目錄名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> mkdir( input_buf );</p><p> while(!ov
56、er)</p><p><b> {</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] != '\0' )</p><p> mkdir( input_buf );</p><p><
57、;b> }</b></p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> if(( strcmp( input_buf, "rmdir" ) == 0 )
58、 || ( strcmp( input_buf, "rd" ) == 0 ))</p><p><b> {</b></p><p> if( over )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趓mdir后輸入要?jiǎng)h除的目
59、錄名" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> getcmd();</b></p><p> if( inp
60、ut_buf[0] == '\0' )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趓mdir后輸入要?jiǎng)h除的目錄名\n" );</p><p> clearbuf();</p><p><b> return 0;</b>
61、</p><p><b> }</b></p><p> rmdir( input_buf );</p><p> while( !over )</p><p><b> {</b></p><p><b> getcmd();</b><
62、/p><p> if( input_buf[0] != '\0' )</p><p> rmdir( input_buf );</p><p><b> }</b></p><p> clearbuf();</p><p><b> return 0;</b&
63、gt;</p><p><b> }</b></p><p> if( strcmp( input_buf, "mkfile" ) == 0 || ( strcmp( input_buf, "mf" ) == 0 ))</p><p><b> {</b></p>
64、<p> if( over )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趍kfile后輸入要?jiǎng)?chuàng)建的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b><
65、/p><p><b> }</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] == '\0' )</p><p><b> {</b></p><p> printf(
66、 "請(qǐng)?jiān)趍kfile后輸入要?jiǎng)?chuàng)建的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> creat( input_buf,01777);</p>
67、;<p> while(!over)</p><p><b> {</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] != '\0' )</p><p> creat( input_buf,017
68、77);</p><p><b> }</b></p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> if( strcmp( input_buf,
69、 "open" ) == 0 )</p><p><b> {</b></p><p> if( over )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趏pen后輸入要打開的文件名\n" );</p>
70、<p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] == '\0
71、39; )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趏pen后輸入要打開的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p>&l
72、t;b> }</b></p><p> open( input_buf,0004);</p><p> while(!over)</p><p><b> {</b></p><p><b> getcmd();</b></p><p> if(
73、 input_buf[0] != '\0' )</p><p> open( input_buf,0004);</p><p><b> }</b></p><p> clearbuf();</p><p><b> return 0;</b></p><
74、p><b> }</b></p><p> if( strcmp( input_buf, "write" ) == 0 )</p><p><b> {</b></p><p> if( over )</p><p><b> {</b>&l
75、t;/p><p> printf( "請(qǐng)?jiān)趙rite后輸入要執(zhí)行“寫”操作的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p><
76、;b> getcmd();</b></p><p> if( input_buf[0] == '\0' )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)趙rite后輸入要執(zhí)行“寫”操作的文件名\n" );</p><p>
77、clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> fd1=creat( input_buf,01777);</p><p> i=write(fd1,str,512);</p><p>
78、; printf("請(qǐng)輸入你要寫的內(nèi)容:");</p><p> for(j=0;j<i;i++)</p><p><b> {</b></p><p> scanf("%c",&str[i]);</p><p> if( str[i] == '\n
79、' )</p><p><b> break;</b></p><p><b> }</b></p><p> while(!over)</p><p><b> {</b></p><p><b> getcmd();<
80、;/b></p><p> if( input_buf[0] != '\0' )</p><p><b> {</b></p><p> fd1=creat( input_buf,01777);</p><p> i=write(fd1,str,512);</p><p&
81、gt; printf("請(qǐng)輸入你要寫的內(nèi)容:");</p><p> for(j=0;j<i;i++)</p><p><b> {</b></p><p> scanf("%c",&str[i]);</p><p> if( str[i] == '
82、\n' )</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> clearbuf();
83、</p><p><b> return 0;</b></p><p><b> }</b></p><p> if( strcmp( input_buf, "close" ) == 0 )</p><p><b> {</b></p>
84、<p> if( over )</p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)赾lose后輸入要關(guān)閉的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></
85、p><p><b> }</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] == '\0' )</p><p><b> {</b></p><p> printf(
86、"請(qǐng)?jiān)赾lose后輸入要關(guān)閉的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> fd1=creat( input_buf,01777);</p&
87、gt;<p> close(fd1);</p><p> while(!over)</p><p><b> {</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] != '\0' )</p&
88、gt;<p><b> {</b></p><p> fd1=creat( input_buf,01777);</p><p> close(fd1);</p><p><b> }</b></p><p><b> }</b></p>&
89、lt;p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p> if( strcmp( input_buf, "delete" ) == 0 )</p><p><b>
90、{</b></p><p><b> if(over)</b></p><p><b> {</b></p><p> printf( "請(qǐng)?jiān)赿elete后輸入要?jiǎng)h除的文件名\n" );</p><p> clearbuf();</p><
91、p><b> return 0;</b></p><p><b> }</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] == '\0' )</p><p><b> {&
92、lt;/b></p><p> printf( "請(qǐng)?jiān)赿elete后輸入要?jiǎng)h除的文件名\n" );</p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><p
93、> _delete(input_buf);</p><p> while(!over)</p><p><b> {</b></p><p><b> getcmd();</b></p><p> if( input_buf[0] != '\0' )</p>
94、;<p> _delete(input_buf);</p><p><b> }</b></p><p> clearbuf();</p><p><b> return 0;</b></p><p><b> }</b></p><
95、p> if( strcmp( input_buf, "logout" ) == 0 )</p><p><b> {</b></p><p> clearbuf();</p><p><b> return 1;</b></p><p><b> }&l
96、t;/b></p><p> /* 找不到該命令 */</p><p> if( input_buf[0] != '\0' )</p><p><b> {</b></p><p> printf( "bash: %s command not found\n", inpu
97、t_buf );</p><p> clearbuf();</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> /* 取得命令 */</p&g
98、t;<p><b> getcmd()</b></p><p><b> {</b></p><p><b> int i= 0;</b></p><p> while( !over )</p><p><b> {</b><
99、/p><p> input_buf[i] = getchar();</p><p> if( input_buf[i] == ' ' )</p><p><b> {</b></p><p> if( i == 0 )/* 命令行的開始是空格,應(yīng)舍去 */</p><p&
100、gt;<b> i--;</b></p><p><b> else</b></p><p><b> {</b></p><p> input_buf[i]='\0';</p><p><b> break;</b></p
101、><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> if( input_buf[i] == '\n' )</p><p><b> {<
102、/b></p><p><b> over = 1;</b></p><p> input_buf[i]='\0';</p><p><b> break;</b></p><p><b> }</b></p><p>&l
103、t;b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p> /* 清空緩沖區(qū) */</p><p> clearbuf()</p><p><b> {</b>&
104、lt;/p><p> while( !over )</p><p><b> {</b></p><p> if( getchar() =='\n' )</p><p><b> break;</b></p><p><b> }</b&
105、gt;</p><p><b> }</b></p><p> ③文件系統(tǒng)格式化函數(shù):</p><p> #include <stdio.h></p><p> #include "filsys.h"</p><p> int format() //文件系
106、統(tǒng)格式化函數(shù)</p><p> {</p><p> struct filsys aaa;</p><p> struct inode * inode;</p><p> struct user tempuser[USERNUM];</p><p> struct dinode din
107、ode_buf;</p><p> struct direct dir_buf[BLOCKSIZ / DIRECTSIZ];</p><p> unsigned int block_buf[BLOCKSIZ / sizeof( int )];</p><p> char * buf;</p><p> int i, j, k;<
108、/p><p> fd = fopen( "filesystem.dat", "w+b" );/* 建立文件 */</p><p> buf = (char * )malloc( 1024*1024 );/* 申請(qǐng)1M空間 */</p><p> if( buf == NULL )/* 申請(qǐng)不成功,返回
109、 */</p><p><b> {</b></p><p> printf( "\nThe system file can't be created!\n" );</p><p><b> return 0;</b></p><p><b> }<
110、;/b></p><p> /* 申請(qǐng)成功,把其空間寫入filesystem.dat,使filesystem.dat為1M */</p><p> fseek( fd, 0, SEEK_SET );</p><p> fwrite( buf, 1, 1024*1024, fd );</p><p> free ( buf );&
111、lt;/p><p> dinode_buf.di_mode = DIEMPTY;/* 設(shè)置磁盤i節(jié)點(diǎn)緩沖區(qū),DIEMPTY表示空閑 */</p><p> fseek( fd, DINODESTART, SEEK_SET );</p><p> for( i = 0; i < DINODEBLK * BLOCKSIZ / DINODESIZ; i++
112、 )</p><p><b> {</b></p><p> fseek( fd, DINODESTART + DINODESIZ * i, SEEK_SET );</p><p> fwrite( &dinode_buf, 1, sizeof( dinode_buf ), fd );</p><p>&l
113、t;b> }</b></p><p> /* 1. creat the main directory and its sub dir etc and the file password */</p><p> inode = iget( 0 );</p><p> inode->i_mode = DIEMPTY;/* 第0塊
114、不用 */</p><p> iput( inode );</p><p> inode = iget( 1 );/* 第1盤塊放用戶名表 */</p><p> inode->i_number = 1;</p><p> inode->i_mode = DIREG; //普通文件</p>&
115、lt;p> inode->i_size = sizeof( struct user ) * USERNUM;</p><p> inode->i_addr[0] = 1;</p><p> /* 用戶imacih是超級(jí)用戶 */</p><p> strcpy( tempuser[0].u_name, "imacih"
116、);</p><p> strcpy( tempuser[0].password, "dgh123456" );</p><p> tempuser[0].u_default_mode = SUPERMODE;</p><p> tempuser[0].u_gid = 1;</p><p> tempuser[0]
117、.u_uid = 1;</p><p> for( i = 1; i < USERNUM; i++ )</p><p><b> {</b></p><p> strcpy( tempuser[i].u_name, " " );</p><p><b> }</b>
118、</p><p> fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );</p><p> fwrite( tempuser, 1, inode->i_size, fd );</p><p> iput( inode );</p><p> inod
119、e = iget( 2 );/* 第2盤塊用于存儲(chǔ)根目錄 */</p><p> inode->i_number = 1;</p><p> inode->i_mode = DEFAULTMODE | DIDIR;</p><p> inode->i_size = 2 * DIRECTSIZ;</p><p>
120、 inode->i_addr[0] = 2;</p><p> strcpy( dir_buf[0].d_name, "/" );</p><p> dir_buf[0].d_ino = 2;</p><p> strcpy( dir_buf[1].d_name, "/" );</p><p&
121、gt; dir_buf[1].d_ino = 2;</p><p> strcpy( dir_buf[2].d_name, "etc" );</p><p> dir_buf[2].d_ino = 3;</p><p> fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK
122、_SET );</p><p> fwrite( dir_buf, 1, inode->i_size, fd );</p><p> iput( inode );</p><p> inode = iget( 2 );/* 2 etc dir id */</p><p> inode->i_number =
123、1;</p><p> inode->i_mode = DEFAULTMODE | DIDIR;</p><p> inode->i_size = 2 * DIRECTSIZ;</p><p> inode->i_addr[0] = 2;/* 第3盤塊用于根目錄下的子目錄 */</p><p> strc
124、py( dir_buf[0].d_name, ".." );</p><p> dir_buf[0].d_ino = 1;</p><p> strcpy( dir_buf[1].d_name, "." );</p><p> dir_buf[1].d_ino = 2;</p><p> fse
125、ek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );</p><p> fwrite( dir_buf, 1, 2 * DIRECTSIZ, fd );</p><p> iput( inode );</p><p> /* 2. 初始化超級(jí)塊 */</p><p&g
126、t; filsys.s_ninode = DINODEBLK * BLOCKSIZ / DINODESIZ - 3;/* 空閑磁盤i節(jié)點(diǎn)數(shù) */</p><p> filsys.s_nfree = FILEBLK - 3;/* 空閑文件塊數(shù) */</p><p> /* 初始化空閑磁盤i節(jié)點(diǎn)堆棧 */</p><p> for( i = 0; i
127、< NICINOD; i++ )</p><p><b> {</b></p><p> filsys.s_inode[i] = 3 + i;/* 從第3個(gè)磁盤i塊,前面3個(gè)已用 */</p><p><b> }</b></p><p> filsys.s_pinode =
128、0;/* 當(dāng)前空閑塊指針 */</p><p> filsys.s_rinode = NICINOD + 3;// 下一準(zhǔn)備裝入空閑盤塊號(hào)棧的盤塊號(hào)</p><p> /* 把第1組空閑盤塊放進(jìn)空閑盤塊堆棧 */</p><p> for( i = 0; i < NICFREE; i++ )</p><p>&l
129、t;b> {</b></p><p> filsys.s_free[i] = 3 + NICFREE - 1 - i;</p><p><b> }</b></p><p> filsys.s_pfree = NICFREE - 1;</p><p> for( i = 3 + NICFREE
130、 * 2 - 1; i < FILEBLK; i += NICFREE )</p><p><b> {</b></p><p> for( j = 0; j < NICFREE; j++ )</p><p> {/* 往緩沖區(qū)寫與成組鏈接法組織空閑盤塊有關(guān)的信息:下一組盤塊空閑塊號(hào)與塊數(shù) */</p><
131、;p> block_buf[j] = i - j;</p><p><b> }</b></p><p> block_buf[NICFREE] = NICFREE;/* 該項(xiàng)記錄本組的空閑盤塊數(shù) */</p><p> /* 把緩沖區(qū)內(nèi)容寫到每組空閑盤塊的最后一塊中 */</p><p> bwr
132、ite( i - NICFREE, block_buf );</p><p><b> }</b></p><p> /* 最后一組空閑盤塊可能不足NICFREE塊,故需單獨(dú)處理 */</p><p> i = i - NICFREE;</p><p> for( j = 0; j < FILEBLK -
133、i + 1; j++ )</p><p> block_buf[j] = FILEBLK - j;</p><p> block_buf[NICFREE] = FILEBLK - i + 1;/* 最末組的空閑盤塊數(shù) */</p><p> bwrite( i, block_buf );</p><p> /* 把超級(jí)塊寫入 bl
134、ock 1# */</p><p> fseek( fd, BLOCKSIZ, SEEK_SET );</p><p> fwrite( &filsys, 1, sizeof( struct filsys ), fd );</p><p> aaa=filsys;</p><p><b> ret
135、urn 1;</b></p><p><b> }</b></p><p> ?、芸臻e盤塊分配、回收函數(shù):</p><p> #include <stdio.h></p><p> #include "filsys.h"</p><p> sta
136、tic unsigned int block_buf[BLOCKSIZ];</p><p> /* 空閑盤塊分配函數(shù) */</p><p> unsigned int balloc()</p><p><b> {</b></p><p> unsigned int free_block, free_block_
137、num;</p><p><b> int i;</b></p><p> if( filsys.s_nfree == 0 )/* 磁盤已滿,無空閑盤塊 */</p><p><b> {</b></p><p> printf( "Disk has no space
138、\n" );</p><p> return -1;</p><p><b> }</b></p><p> free_block = filsys.s_free[filsys.s_pfree];</p><p> if( filsys.s_pfree == 0 )/* 已經(jīng)是棧底 */&
139、lt;/p><p><b> {</b></p><p> /* 讀取棧底盤塊號(hào)所對(duì)應(yīng)的盤塊數(shù)據(jù) */</p><p> bread( filsys.s_free[filsys.s_pfree], block_buf );</p><p> free_block_num = block_buf[NICFREE];
140、/* 該空閑盤塊組的盤塊數(shù) */</p><p> /* 把盤塊組放到空閑盤塊號(hào)棧上 */</p><p> for( i = 0; i < free_block_num; i++ )</p><p> filsys.s_free[i] = block_buf[i];</p><p> filsys.s_pfree = free
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文件系統(tǒng)-課程設(shè)計(jì)報(bào)告附源代碼
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng)
- 多文件系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)
- cramfs文件系統(tǒng)移植課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--多級(jí)文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計(jì)---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計(jì)---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--linux二級(jí)文件系統(tǒng)設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告--虛擬文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)簡單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)二級(jí)文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)(文件系統(tǒng)管理)
評(píng)論
0/150
提交評(píng)論