模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc

上傳人:小** 文檔編號:16684387 上傳時間:2020-10-21 格式:DOC 頁數(shù):21 大?。?67.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc_第1頁
第1頁 / 共21頁
模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc_第2頁
第2頁 / 共21頁
模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc_第3頁
第3頁 / 共21頁

下載文檔到電腦,查找使用更方便

5 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc》由會員分享,可在線閱讀,更多相關(guān)《模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc(21頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、 中北大學(xué) 操作系統(tǒng)課程設(shè)計(jì) 說 明 書 學(xué) 院、系: 軟件學(xué)院 專 業(yè): 軟件工程 學(xué) 生 姓 名: xxx 學(xué) 號: xxx 設(shè) 計(jì) 題 目: 模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 起 迄 日 期: 2015年12月28日- 2016年1月8日 指 導(dǎo) 教 師: xxx 2016 年1月8日 1 需求分析 通過模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。同時通過編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識的能力;掌握操作

2、系統(tǒng)結(jié)構(gòu)、實(shí)現(xiàn)機(jī)理和各種典型算法,系統(tǒng)地了解操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)思路,并了解操作系統(tǒng)的發(fā)展動向和趨勢。 模擬二級文件管理系統(tǒng)的課程設(shè)計(jì)目的是通過研究Linux的文件系統(tǒng)結(jié)構(gòu),模擬設(shè)計(jì)一個簡單的二級文件系統(tǒng),第一級為主目錄文件,第二級為用戶文件。 2 總體設(shè)計(jì) 結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計(jì)、計(jì)算機(jī)原理等課程的知識,設(shè)計(jì)一個二級文件系統(tǒng),進(jìn)一步理解操作系統(tǒng)。 文件的創(chuàng)建: create 文件關(guān)閉:close 文件的打開:open 文件的讀:read 文件的寫:write 文件關(guān)閉:close 刪除文件:dele

3、te 創(chuàng)建子目錄:mkdir 刪除子目錄:rmdir 列出文件目錄:dir 退出:exit 開 始 系統(tǒng)執(zhí)行流程圖 選擇操作 創(chuàng)建文件 刪除文件 讀文件 寫文件 創(chuàng)建文件夾 刪除文件夾 刪除子目錄 顯示當(dāng)前子目錄 創(chuàng)建子目錄 更改目錄 退出 退出 3. 詳細(xì)設(shè)計(jì) 主要數(shù)據(jù)結(jié)構(gòu): #define MEM_D_SIZE 1024*1024 //總磁盤空間為1M #define DISKSIZE 1024 //磁盤

4、塊的大小1K #define DISK_NUM 1024 //磁盤塊數(shù)目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號 #define ROOT_DISK_SIZE sizeof(struct direct) //根目錄大小 #define DIR_MAXSIZE 1024 //路徑最大長度為1KB #define MSD 5 //最大子目錄數(shù)5 #define MOFN 5

5、 //最大文件深度為5 #define MAX_WRITE 1024*128 //最大寫入文字長度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一個磁盤的指針*/ char em_disk; /*磁盤塊是否空閑標(biāo)志位 0 空閑*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目錄名 8位*/ char property; /*屬性 1位目錄

6、0位普通文件*/ int size; /*文件/目錄字節(jié)數(shù)、盤塊數(shù))*/ int firstdisk; /*文件/目錄 起始盤塊號*/ int next; /*子目錄起始盤塊號*/ int sign; /*1是根目錄 0不是根目錄*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盤塊號*/ int siz

7、e; /*文件的大小*/ }openitem[MOFN]; int cur_size; /*當(dāng)前打文件的數(shù)目*/ }; 管理文件的主要代碼: int create(char *name) { int i,j; if(strlen(name)>8) /*文件名大于 8位*/ return(-1); for(j=2;jdirectitem[j].name,name))

8、 break; } if(jdirectitem[i].firstdisk==-1) break; } if(i>=MSD+2) /*無空目錄項(xiàng)*/ return(-2); if(u_opentable.cur_size>=MOFN) /*打開文件太多*/ return

9、(-3); for(j=ROOT_DISK_NO+1;j=DISK_NUM) return(-5); fat[j].em_disk = 1; /*將空閑塊置為已經(jīng)分配*/ /*-----------填寫目錄項(xiàng)-----------------*/ strcpy(cur_dir->directitem[i].name,name);

10、 cur_dir->directitem[i].firstdisk = j; cur_dir->directitem[i].size = 0; cur_dir->directitem[i].next = j; cur_dir->directitem[i].property = 0; /*---------------------------------*/ fd = open(name); return 0; } int open(char *name) { int i, j;

11、 for(i=2;idirectitem[i].name,name)) break; } if(i>=MSD+2) return(-1); /*--------是文件還是目錄-----------------------*/ if(cur_dir->directitem[i].property==1) return(-4); /*--------文件是否打開-------------

12、----------*/ for(j=0;j=MOFN) /*文件打開太多*/ return(-3); /*--------查找一個空閑用戶打開表項(xiàng)-----------------------*/

13、 for(j=0;jdirectitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name); u_open

14、table.openitem[j].size = cur_dir->directitem[i].size; u_opentable.cur_size++; /*----------返回用戶打開表表項(xiàng)的序號--------------------------*/ return(j); } int close(char *name) { int i; for(i=0;i

15、break; } if(i>=MOFN) return(-1); /*-----------清空該文件的用戶打開表項(xiàng)的內(nèi)容---------------------*/ strcpy(u_opentable.openitem[i].name,""); u_opentable.openitem[i].firstdisk = -1; u_opentable.openitem[i].size = 0; u_opentable.cur_size--; return 0;

16、 } int write(int fd, char *buf, int len) { char *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*----------用 $ 字符作為空格 # 字符作為換行符-----------------------*/ char Space = 32; char Endter= \n; for(i=0;i

17、else if(buf[i] == #) buf[i] = Endter; } /*----------讀取用戶打開表對應(yīng)表項(xiàng)第一個盤塊號-----------------------*/ item = u_opentable.openitem[fd].firstdisk; /*-------------找到當(dāng)前目錄所對應(yīng)表項(xiàng)的序號-------------------------*/ for(i=2;idirectitem[i].firstdisk==item)

18、 break; } temp = i; /*-存放當(dāng)前目錄項(xiàng)的下標(biāo)-*/ /*------找到的item 是該文件的最后一塊磁盤塊-------------------*/ while(fat[item].item!=-1) { item =fat[item].item; /*-查找該文件的下一盤塊--*/ } /*-----計(jì)算出該文件的最末地址-------*/ first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE; /*-----如

19、果最后磁盤塊剩余的大小大于要寫入的文件的大小-------*/ if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len) { strcpy(first,buf); u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len; cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; } else { for(i=0;i<(DISK

20、SIZE-u_opentable.openitem[fd].size%DISKSIZE);i++) {/*寫一部分內(nèi)容到最后一塊磁盤塊的剩余空間(字節(jié))*/ first[i] = buf [i]; } /*-----計(jì)算分配完最后一塊磁盤的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲-------*/ ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE); ilen2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(

21、modlen>0) ilen2 = ilen2+1; /*--還需要多少塊磁盤塊-*/ for(j=0;j=DISK_NUM) /*--如果磁盤塊已經(jīng)分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁盤塊的起始地

22、址-*/ if(j==ilen2-1) /*--如果是最后要分配的一塊-*/ { for(k=0;k

23、*--找到一塊后將它的序號存放在上一塊的指針中-*/ fat[i].em_disk = 1; /*--置找到的磁盤快的空閑標(biāo)志位為已分配-*/ fat[i].item = -1; /*--它的指針為 -1 (即沒有下一塊)-*/ } /*--修改長度-*/ u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len; cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; }

24、return 0; } int read(int fd, char *buf) { int len = u_opentable.openitem[fd].size; char *first; int i, j, item; int ilen1, modlen; item = u_opentable.openitem[fd].firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*--計(jì)

25、算文件所占磁盤的塊數(shù)-*/ first = fdisk+item*DISKSIZE; /*--計(jì)算文件的起始位置-*/ for(i=0;i

26、KSIZE+j] = first[j]; item = fat[item].item; /*-查找下一盤塊-*/ first = fdisk+item*DISKSIZE; } } return 0; } int del(char *name) { int i,cur_item,item,temp; for(i=2;idirectitem[i].name,name)) break;

27、 } cur_item = i; /*--用來保存目錄項(xiàng)的序號,供釋放目錄中-*/ if(i>=MSD+2) /*--如果不在當(dāng)前目錄中-*/ return(-1); if(cur_dir->directitem[cur_item].property!=0) /*--如果刪除的(不)是目錄-*/ return(-3); for(i=0;i

28、turn(-2); } item = cur_dir->directitem[cur_item].firstdisk;/*--該文件的起始盤塊號-*/ while(item!=-1) /*--釋放空間,將FAT表對應(yīng)項(xiàng)進(jìn)行修改-*/ { temp = fat[item].item; fat[item].item = -1; fat[item].em_disk = 0; item = temp; } /*-----------------釋放目錄項(xiàng)-----------------------*/ cur_dir->dir

29、ectitem[cur_item].sign = 0; cur_dir->directitem[cur_item].firstdisk = -1; strcpy(u_opentable.openitem[cur_item].name,""); cur_dir->directitem[cur_item].next = -1; cur_dir->directitem[cur_item].property = 0; cur_dir->directitem[cur_item].size = 0; return 0; } 主函數(shù): int

30、main() { FILE *fp; char ch; char a[100]; char code[11][10]; char name[10]; int i,flag,r_size; char *contect; contect = (char *)malloc(MAX_WRITE*sizeof(char)); if((fp=fopen("disk.dat","rb"))==NULL) { printf("You have not format,Do you want format?(y/n)");

31、scanf("%c",&ch); if(ch==y) { initfile(); printf("Successfully format! \n"); } else { return 0; } } enter(); print(); show(); strcpy(code[0],"exit"); strcpy(code[1],"create"); strcpy(code[2],"open"); strcpy(code[3],"close");

32、strcpy(code[4],"write"); strcpy(code[5],"read"); strcpy(code[6],"del"); strcpy(code[7],"mkdir"); strcpy(code[8],"rmdir"); strcpy(code[9],"dir"); strcpy(code[10],"cd"); while(1) { scanf("%s",a); for(i=0;i<11;i++) { if(!strcmp(code[i],a)) break; }

33、 switch(i) { case 0: //退出文件系統(tǒng) free(contect); halt(); return 0; case 1: //創(chuàng)建文件 scanf("%s",name); flag = create(name); if(flag==-1) { printf("Error: \n The length is too long !\n"); } else if(flag==-2) { printf("Error: \n T

34、he direct item is already full !\n"); } else if(flag==-3) { printf("Error: \n The number of openfile is too much !\n"); } else if(flag==-4) { printf("Error: \n The name is already in the direct !\n"); } else if(flag==-5) { printf("Error:

35、 \n The disk space is full!\n"); } else { printf("Successfully create a file! \n"); } show(); break; case 2://打開文件 scanf("%s",name); fd = open(name); if(fd == -1) { printf("Error: \n The open file not exit! \n"); }

36、else if(fd == -2) { printf("Error: \n The file have already opened! \n"); } else if(fd == -3) { printf("Error: \n The number of open file is too much! \n"); } else if(fd == -4) { printf("Error: \n It is a direct,can not open for read or write! \n"

37、); } else { printf("Successfully opened! \n"); } show(); break; case 3://關(guān)閉文件 scanf("%s",name); flag = close(name); if(flag == -1) { printf("Error:\n The file is not opened ! \n"); } else { printf("Successfu

38、lly closed! \n"); } show(); break; case 4://寫文件 if(fd ==-1) { printf("Error:\n The file is not opened ! \n"); } else { printf("Please input the file contect:"); scanf("%s",contect); flag=write(fd,contect,strlen(contect));

39、if(flag == 0) { printf("Successfully write! \n"); } else { printf("Error:\n The disk size is not enough! \n"); } } show(); break; case 5://讀文件 if(fd ==-1) { printf("Error:\n The file is not opened ! \n"); }

40、else { flag = read(fd,contect); if(flag == 0) { for(i=0;i

41、ame); if(flag == -1) { printf("Error:\n The file not exit! \n"); } else if(flag == -2) { printf("Error:\n The file is opened,please first close it ! \n"); } else if(flag == -3) { printf("Error:\n The delete is not file ! \n"); } els

42、e { printf("Successfully delete! \n"); } show(); break; } } } 程序運(yùn)行截圖: 4. 心得體會 在設(shè)計(jì)的過程中,我查詢了不少相關(guān)資料,不斷地發(fā)現(xiàn)問題、提出問題、解決問題。用C做程序開發(fā)語言,讓我重新認(rèn)識了C的基礎(chǔ),在新語言不斷出現(xiàn)并發(fā)展迅速的今天,重新體會到C的基礎(chǔ)性、重要性,以及面對過程,面對函數(shù)式的編程方式。 在對自己所編寫的源程序段的糾錯的過程中,使我更好的理解了操作系統(tǒng)中文件系統(tǒng)的理論知識,同時在編程時用到了模塊化的設(shè)計(jì)思想,這種編程方法可以使我們的編程更簡單,可以使我們的查錯與糾錯變得更加方便。 總的來說通過這次的設(shè)計(jì)學(xué)習(xí)使我學(xué)到了很多在平時的學(xué)習(xí)中學(xué)不到的很多東西,對操作系統(tǒng)有了更深一層的了解,同時也提高了C語言的能力,由于時間以及個人知識的問題,因此有很多的地方還需要改進(jìn)。在以后的學(xué)習(xí)中還要更加努力。

展開閱讀全文
溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!