模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc
《模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).doc(21頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 中北大學(xué) 操作系統(tǒng)課程設(shè)計(jì) 說(shuō) 明 書(shū) 學(xué) 院、系: 軟件學(xué)院 專 業(yè): 軟件工程 學(xué) 生 姓 名: xxx 學(xué) 號(hào): xxx 設(shè) 計(jì) 題 目: 模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 起 迄 日 期: 2015年12月28日- 2016年1月8日 指 導(dǎo) 教 師: xxx 2016 年1月8日 1 需求分析 通過(guò)模擬文件系統(tǒng)的實(shí)現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識(shí), 加深對(duì)教材中的重要算法的理解。同時(shí)通過(guò)編程實(shí)現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,提高綜合運(yùn)用各專業(yè)課知識(shí)的能力;掌握操作
2、系統(tǒng)結(jié)構(gòu)、實(shí)現(xiàn)機(jī)理和各種典型算法,系統(tǒng)地了解操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)思路,并了解操作系統(tǒng)的發(fā)展動(dòng)向和趨勢(shì)。 模擬二級(jí)文件管理系統(tǒng)的課程設(shè)計(jì)目的是通過(guò)研究Linux的文件系統(tǒng)結(jié)構(gòu),模擬設(shè)計(jì)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng),第一級(jí)為主目錄文件,第二級(jí)為用戶文件。 2 總體設(shè)計(jì) 結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計(jì)、計(jì)算機(jī)原理等課程的知識(shí),設(shè)計(jì)一個(gè)二級(jí)文件系統(tǒng),進(jìn)一步理解操作系統(tǒng)。 文件的創(chuàng)建: create 文件關(guān)閉:close 文件的打開(kāi):open 文件的讀:read 文件的寫(xiě):write 文件關(guān)閉:close 刪除文件:dele
3、te 創(chuàng)建子目錄:mkdir 刪除子目錄:rmdir 列出文件目錄:dir 退出:exit 開(kāi) 始 系統(tǒng)執(zhí)行流程圖 選擇操作 創(chuàng)建文件 刪除文件 讀文件 寫(xiě)文件 創(chuàng)建文件夾 刪除文件夾 刪除子目錄 顯示當(dāng)前子目錄 創(chuàng)建子目錄 更改目錄 退出 退出 3. 詳細(xì)設(shè)計(jì) 主要數(shù)據(jù)結(jié)構(gòu): #define MEM_D_SIZE 1024*1024 //總磁盤(pán)空間為1M #define DISKSIZE 1024 //磁盤(pán)
4、塊的大小1K #define DISK_NUM 1024 //磁盤(pán)塊數(shù)目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤(pán)塊號(hào) #define ROOT_DISK_SIZE sizeof(struct direct) //根目錄大小 #define DIR_MAXSIZE 1024 //路徑最大長(zhǎng)度為1KB #define MSD 5 //最大子目錄數(shù)5 #define MOFN 5
5、 //最大文件深度為5 #define MAX_WRITE 1024*128 //最大寫(xiě)入文字長(zhǎng)度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一個(gè)磁盤(pán)的指針*/ char em_disk; /*磁盤(pán)塊是否空閑標(biāo)志位 0 空閑*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目錄名 8位*/ char property; /*屬性 1位目錄
6、0位普通文件*/ int size; /*文件/目錄字節(jié)數(shù)、盤(pán)塊數(shù))*/ int firstdisk; /*文件/目錄 起始盤(pán)塊號(hào)*/ int next; /*子目錄起始盤(pán)塊號(hào)*/ int sign; /*1是根目錄 0不是根目錄*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盤(pán)塊號(hào)*/ 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++;
/*----------返回用戶打開(kāi)表表項(xiàng)的序號(hào)--------------------------*/
return(j);
}
int close(char *name)
{
int i;
for(i=0;i 15、break;
}
if(i>=MOFN)
return(-1);
/*-----------清空該文件的用戶打開(kāi)表項(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;
}
/*----------讀取用戶打開(kāi)表對(duì)應(yīng)表項(xiàng)第一個(gè)盤(pán)塊號(hào)-----------------------*/
item = u_opentable.openitem[fd].firstdisk;
/*-------------找到當(dāng)前目錄所對(duì)應(yīng)表項(xiàng)的序號(hào)-------------------------*/
for(i=2;i 18、 break;
}
temp = i; /*-存放當(dāng)前目錄項(xiàng)的下標(biāo)-*/
/*------找到的item 是該文件的最后一塊磁盤(pán)塊-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找該文件的下一盤(pán)塊--*/
}
/*-----計(jì)算出該文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
/*-----如 19、果最后磁盤(pán)塊剩余的大小大于要寫(xiě)入的文件的大小-------*/
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++)
{/*寫(xiě)一部分內(nèi)容到最后一塊磁盤(pán)塊的剩余空間(字節(jié))*/
first[i] = buf [i];
}
/*-----計(jì)算分配完最后一塊磁盤(pán)的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲(chǔ)-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if( 21、modlen>0)
ilen2 = ilen2+1; /*--還需要多少塊磁盤(pán)塊-*/
for(j=0;j 22、址-*/
if(j==ilen2-1) /*--如果是最后要分配的一塊-*/
{
for(k=0;k 23、*--找到一塊后將它的序號(hào)存放在上一塊的指針中-*/
fat[i].em_disk = 1; /*--置找到的磁盤(pán)快的空閑標(biāo)志位為已分配-*/
fat[i].item = -1; /*--它的指針為 -1 (即沒(méi)有下一塊)-*/
}
/*--修改長(zhǎng)度-*/
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、算文件所占磁盤(pán)的塊數(shù)-*/
first = fdisk+item*DISKSIZE; /*--計(jì)算文件的起始位置-*/
for(i=0;i 26、KSIZE+j] = first[j];
item = fat[item].item; /*-查找下一盤(pán)塊-*/
first = fdisk+item*DISKSIZE;
}
}
return 0;
}
int del(char *name)
{
int i,cur_item,item,temp;
for(i=2;i 27、
}
cur_item = i; /*--用來(lái)保存目錄項(xiàng)的序號(hào),供釋放目錄中-*/
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;/*--該文件的起始盤(pán)塊號(hào)-*/
while(item!=-1) /*--釋放空間,將FAT表對(duì)應(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://打開(kāi)文件
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://寫(xiě)文件
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. 心得體會(huì)
在設(shè)計(jì)的過(guò)程中,我查詢了不少相關(guān)資料,不斷地發(fā)現(xiàn)問(wèn)題、提出問(wèn)題、解決問(wèn)題。用C做程序開(kāi)發(fā)語(yǔ)言,讓我重新認(rèn)識(shí)了C的基礎(chǔ),在新語(yǔ)言不斷出現(xiàn)并發(fā)展迅速的今天,重新體會(huì)到C的基礎(chǔ)性、重要性,以及面對(duì)過(guò)程,面對(duì)函數(shù)式的編程方式。
在對(duì)自己所編寫(xiě)的源程序段的糾錯(cuò)的過(guò)程中,使我更好的理解了操作系統(tǒng)中文件系統(tǒng)的理論知識(shí),同時(shí)在編程時(shí)用到了模塊化的設(shè)計(jì)思想,這種編程方法可以使我們的編程更簡(jiǎn)單,可以使我們的查錯(cuò)與糾錯(cuò)變得更加方便。
總的來(lái)說(shuō)通過(guò)這次的設(shè)計(jì)學(xué)習(xí)使我學(xué)到了很多在平時(shí)的學(xué)習(xí)中學(xué)不到的很多東西,對(duì)操作系統(tǒng)有了更深一層的了解,同時(shí)也提高了C語(yǔ)言的能力,由于時(shí)間以及個(gè)人知識(shí)的問(wèn)題,因此有很多的地方還需要改進(jìn)。在以后的學(xué)習(xí)中還要更加努力。
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案