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

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

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

5 積分

下載資源

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

資源描述:

《模擬文件系統(tǒng)的設計與實現(xiàn).doc》由會員分享,可在線閱讀,更多相關《模擬文件系統(tǒng)的設計與實現(xiàn).doc(21頁珍藏版)》請在裝配圖網上搜索。

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

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

3、te 創(chuàng)建子目錄:mkdir 刪除子目錄:rmdir 列出文件目錄:dir 退出:exit 開 始 系統(tǒng)執(zhí)行流程圖 選擇操作 創(chuàng)建文件 刪除文件 讀文件 寫文件 創(chuàng)建文件夾 刪除文件夾 刪除子目錄 顯示當前子目錄 創(chuàng)建子目錄 更改目錄 退出 退出 3. 詳細設計 主要數(shù)據(jù)結構: #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; /*磁盤塊是否空閑標志位 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; /*當前打文件的數(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) /*無空目錄項*/ 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; /*將空閑塊置為已經分配*/ /*-----------填寫目錄項-----------------*/ 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); /*--------查找一個空閑用戶打開表項-----------------------*/

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++; /*----------返回用戶打開表表項的序號--------------------------*/ return(j); } int close(char *name) { int i; for(i=0;i

15、break; } if(i>=MOFN) return(-1); /*-----------清空該文件的用戶打開表項的內容---------------------*/ 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; } /*----------讀取用戶打開表對應表項第一個盤塊號-----------------------*/ item = u_opentable.openitem[fd].firstdisk; /*-------------找到當前目錄所對應表項的序號-------------------------*/ for(i=2;idirectitem[i].firstdisk==item)

18、 break; } temp = i; /*-存放當前目錄項的下標-*/ /*------找到的item 是該文件的最后一塊磁盤塊-------------------*/ while(fat[item].item!=-1) { item =fat[item].item; /*-查找該文件的下一盤塊--*/ } /*-----計算出該文件的最末地址-------*/ 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++) {/*寫一部分內容到最后一塊磁盤塊的剩余空間(字節(jié))*/ first[i] = buf [i]; } /*-----計算分配完最后一塊磁盤的剩余空間(字節(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) /*--如果磁盤塊已經分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁盤塊的起始地

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

23、*--找到一塊后將它的序號存放在上一塊的指針中-*/ fat[i].em_disk = 1; /*--置找到的磁盤快的空閑標志位為已分配-*/ 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; /*--計

25、算文件所占磁盤的塊數(shù)-*/ first = fdisk+item*DISKSIZE; /*--計算文件的起始位置-*/ 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; /*--用來保存目錄項的序號,供釋放目錄中-*/ if(i>=MSD+2) /*--如果不在當前目錄中-*/ 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表對應項進行修改-*/ { temp = fat[item].item; fat[item].item = -1; fat[item].em_disk = 0; item = temp; } /*-----------------釋放目錄項-----------------------*/ 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://關閉文件 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; } } } 程序運行截圖: 4. 心得體會 在設計的過程中,我查詢了不少相關資料,不斷地發(fā)現(xiàn)問題、提出問題、解決問題。用C做程序開發(fā)語言,讓我重新認識了C的基礎,在新語言不斷出現(xiàn)并發(fā)展迅速的今天,重新體會到C的基礎性、重要性,以及面對過程,面對函數(shù)式的編程方式。 在對自己所編寫的源程序段的糾錯的過程中,使我更好的理解了操作系統(tǒng)中文件系統(tǒng)的理論知識,同時在編程時用到了模塊化的設計思想,這種編程方法可以使我們的編程更簡單,可以使我們的查錯與糾錯變得更加方便。 總的來說通過這次的設計學習使我學到了很多在平時的學習中學不到的很多東西,對操作系統(tǒng)有了更深一層的了解,同時也提高了C語言的能力,由于時間以及個人知識的問題,因此有很多的地方還需要改進。在以后的學習中還要更加努力。

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

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

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

備案號:ICP2024067431-1 川公網安備51140202000466號


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