模擬文件系統(tǒng)的設(shè)計與實現(xiàn).doc
《模擬文件系統(tǒng)的設(shè)計與實現(xiàn).doc》由會員分享,可在線閱讀,更多相關(guān)《模擬文件系統(tǒng)的設(shè)計與實現(xiàn).doc(21頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 中北大學(xué) 操作系統(tǒng)課程設(shè)計 說 明 書 學(xué) 院、系: 軟件學(xué)院 專 業(yè): 軟件工程 學(xué) 生 姓 名: xxx 學(xué) 號: xxx 設(shè) 計 題 目: 模擬文件系統(tǒng)的設(shè)計與實現(xiàn) 起 迄 日 期: 2015年12月28日- 2016年1月8日 指 導(dǎo) 教 師: xxx 2016 年1月8日 1 需求分析 通過模擬文件系統(tǒng)的實現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。同時通過編程實現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,提高綜合運用各專業(yè)課知識的能力;掌握操作
2、系統(tǒng)結(jié)構(gòu)、實現(xiàn)機(jī)理和各種典型算法,系統(tǒng)地了解操作系統(tǒng)的設(shè)計和實現(xiàn)思路,并了解操作系統(tǒng)的發(fā)展動向和趨勢。 模擬二級文件管理系統(tǒng)的課程設(shè)計目的是通過研究Linux的文件系統(tǒng)結(jié)構(gòu),模擬設(shè)計一個簡單的二級文件系統(tǒng),第一級為主目錄文件,第二級為用戶文件。 2 總體設(shè)計 結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計、計算機(jī)原理等課程的知識,設(shè)計一個二級文件系統(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è)計 主要數(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;j
8、 break;
}
if(j
9、(-3);
for(j=ROOT_DISK_NO+1;j
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;i
12、----------*/
for(j=0;j
13、
for(j=0;j
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);
/*-----------清空該文件的用戶打開表項的內(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)表項第一個盤塊號-----------------------*/
item = u_opentable.openitem[fd].firstdisk;
/*-------------找到當(dāng)前目錄所對應(yīng)表項的序號-------------------------*/
for(i=2;i 18、 break;
}
temp = i; /*-存放當(dāng)前目錄項的下標(biāo)-*/
/*------找到的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++)
{/*寫一部分內(nè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 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; /*--計 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;i 27、
}
cur_item = i; /*--用來保存目錄項的序號,供釋放目錄中-*/
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)項進(jìn)行修改-*/
{
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://關(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;
}
}
}
程序運行截圖:
4. 心得體會
在設(shè)計的過程中,我查詢了不少相關(guān)資料,不斷地發(fā)現(xiàn)問題、提出問題、解決問題。用C做程序開發(fā)語言,讓我重新認(rèn)識了C的基礎(chǔ),在新語言不斷出現(xiàn)并發(fā)展迅速的今天,重新體會到C的基礎(chǔ)性、重要性,以及面對過程,面對函數(shù)式的編程方式。
在對自己所編寫的源程序段的糾錯的過程中,使我更好的理解了操作系統(tǒng)中文件系統(tǒng)的理論知識,同時在編程時用到了模塊化的設(shè)計思想,這種編程方法可以使我們的編程更簡單,可以使我們的查錯與糾錯變得更加方便。
總的來說通過這次的設(shè)計學(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工重大危險源安全管理制度
- 安全培訓(xùn)資料:典型建筑火災(zāi)的防治基本原則與救援技術(shù)
- 企業(yè)雙重預(yù)防體系應(yīng)知應(yīng)會知識問答
- 8 各種煤礦安全考試試題
- 9 危險化學(xué)品經(jīng)營單位安全生產(chǎn)管理人員模擬考試題庫試卷附答案
- 加壓過濾機(jī)司機(jī)技術(shù)操作規(guī)程
- 樹脂砂混砂工藝知識總結(jié)
- XXXXX現(xiàn)場安全應(yīng)急處置預(yù)案
- 某公司消防安全檢查制度總結(jié)
- 1 煤礦安全檢查工(中級)職業(yè)技能理論知識考核試題含答案
- 4.燃?xì)獍踩a(chǎn)企業(yè)主要負(fù)責(zé)人模擬考試題庫試卷含答案
- 工段(班組)級安全檢查表
- D 氯化工藝作業(yè)模擬考試題庫試卷含答案-4
- 建筑起重司索信號工安全操作要點
- 實驗室計量常見的30個問問答題含解析