操作系统大作业--Linux文件管理系统_第1页
操作系统大作业--Linux文件管理系统_第2页
操作系统大作业--Linux文件管理系统_第3页
操作系统大作业--Linux文件管理系统_第4页
操作系统大作业--Linux文件管理系统_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华南理工大学软件学院2013级操作系统大作业实验报告课程名称: 操作系统 任课老师: 作业题目: 简单二级文件系统 班 级: 学生姓名: 学 号: 目录 1. 实验目的2. 实验环境3. 实验内容4. 程序中使用的数据结构及符号说明5. 源程序及注释6. 程序运行时的初值和运行结果一、 实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。二、 实验环境操作系统:Ubuntu 12.04 (Ubuntu/Linaro 4.6.3-1ubuntu5)编译器: gcc 4.6.3 语言:C语言三、 实验内容FMSV1.0系统模拟了原生的文件系统,使用文本来当作磁盘,并使用

2、了空闲块记录表,目录,i-node等数据结构来辅助文件系统的运作。磁盘:一个名为blockDisk的文件,里面含有256个数据块。每个数据块的长度为1024,可存储1024个字符。I节点:包含文件名,文件保护码,文件长度,文件存放位置。目录:一个链表,记录了i节点。空闲块记录表FBT:用于记录磁盘块使用情况,0表示未使用,1表示使用。数据块:保存了文件的数据,一个数据块至多存放一个文件。数据块使用情况:用于记录文件使用数据块的情况。存放在I节点的fat数组中。文件:一个文件最多占用两个数据块,即长度至多为4028.FMSV1.0系统支持的命令行:login:登录register:注册open:

3、打开文件read:读取文件数据到屏幕write:写文件,分为cover和append两种类型;cover是覆盖原数据,append是在不改变原始数据的基础上进行增加。close:关闭文件create:新增文件delete:删除文件exit:退出程序help:帮助四、 程序中使用的数据结构及符号说明/*-结构定义-*/ /*-用户-*/typedef struct userchar account15; /账户最长为10 char password15; /密码最长为10,多出来的是为了方便运算 user;/*-数据节点-*/typedef struct datanode /用于记录文件数据保存

4、在哪个数据块的哪个范围 int num; /数据块号 int begin; /数据开始位置 int end; /数据结束位置 datanode; /*-i节点-*/typedef struct inodeChar filename30;Int num;char code30; /保护码 int size;datanode fatMAX_DATANODE_NUM;int node _num;inode;typedef struct dirEntry /用链表来记录I节点 inode ind;struct dirEntry *next;dirEntry;/*-数据块-*/typedef struc

5、t block char contentMAX_BLOCK_SIZE; /数据块内容最大长度为 1025,预留最后一位用来存储0, int num; int offset; /记录当前数据的数量 block;五、 源程序及注释head.h头文件#include<string.h>#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#define MAX_BLOCKS_NUM 256 /最大数据块数量是256,则数据块总大小是256KB #define MAX_BLOCK_SIZE 1025

6、/数据块数据容量,一个数据块的大小是1KB,最有1位用来存储'0',表示字符串结尾! #define MAX_DATANODE_NUM 2 /每个文件最多占用的数据块的数量 #define MAX_INODE_NUM 512 /i节点的最大数目,亦即系统允许容纳文件的最大数量 #define MAX_CACHE_NUM 32 /允许缓存的最大数据块数量为32个数据块,缓存为32KB /*-结构定义-*/ /*-用户-*/typedef struct userchar account15; /账户最长为10 char password15; /密码最长为10,多出来的是为了方便运

7、算 user;/*-数据节点-*/typedef struct datanode /用于记录文件数据保存在哪个数据块的哪个范围 int num; /数据块号 int begin; /数据开始位置 int end; /数据结束位置 datanode; /*-i节点-*/typedef struct inodechar filename30;int num;char code30; /保护码 int size;datanode fatMAX_DATANODE_NUM;int node_num;inode;typedef struct dirEntry /用链表来记录I节点 inode ind;st

8、ruct dirEntry *next;dirEntry;/*-数据块-*/typedef struct block char contentMAX_BLOCK_SIZE; /数据块内容最大长度为 1024 int num;bool isRevised; /用于记录数据块是否进行数据修改 int offset; /记录当前数据的数量 block;/*-定义全局变量-*/int islogin = 0; /0 means the char blockspath30 = "userdata/blocksDISK.disk" / 所有数据(即虚拟磁盘)地址 char usersp

9、ath30 = "userdata/users.us"static user currUser; /当前用户 static dirEntry *DIR;static int curr_inode_num = 0; /当前i节点数量,亦即文件数量 static block *cache; int max_node = 0; /最大的inode编号 static int FBTMAX_BLOCKS_NUM;static char *dirpath;static char fbtpath30 = "userdata/FBT.disk"static dirEnt

10、ry* selectEntry; /当selectEntry=NULL时,证明没有打开文件 static dirEntry* currEntry;/命令行 static char cm_help10 = "help"static char cm_lg10 = "login"static char cm_rg10 = "register"static char cm_dir10 = "dir"static char cm_create10 = "create"static char cm_dele

11、te10 = "delete"static char cm_open10 = "open"static char cm_read10 = "read"static char cm_write10 = "write"static char cm_close10 = "close"static char cm_exit10 = "exit"static char cm_cancle10 = "cancle"/*-函数声明-*/void createStyle(

12、int,char);void createWrap(int);int createSystem(); int diskUpdate(block);void start();void getUser();int login();int regist();char lgOrRg(); void createBlocksDisk();FILE* createDir();void initDir(char *);int getAction();void initFBT(); /初始化数据空闲块记录表 int getCode();int getFreeBlock(bool);void saveDir()

13、;void saveBlock(block bk);void saveFBT();int createHelp(char *filename);dirEntry* delHelp(char *filename);void createDataDir();/响应指令的函数 int LgRg(); /登录或注册 void help();void dir();void create();void del();void open();void close();void read();void write();void coverHelp();void appendHelp();/Linux doesn

14、't support the function strcmpi, so I need to finish it by strcmpi(char *p1, char *p2)if(strlen(p1)!=strlen(p2)return -1;int i;for(i=0; i<strlen(p1); i+)if(p1i!=p2i)return -1;return 0;void createDataDir()char *datapath = "userdata"printf("No dataDir !nNow create it .

15、n");if(mkdir(datapath,0777)printf("Can not create DataDir .nPlease contact QQ878631510 for help.nCrtl+C to exit.n");while(1);printf("Succeed creating dataDir !n");void showInode(inode ind)printf("num: %dn",ind.num);printf("filename: %sn",ind.filename);pri

16、ntf("size: %dn",ind.size);/界面美化函数 void createStyle(int num, char style)while(num-)printf("%c", style);void createWrap(int n)while(n-)printf("n");/辅助函数char lgOrRg()while(1)char com10;printf("login or register: ");scanf("%s",com);if(!strcmpi(com,cm_lg)

17、return 'l'if(!strcmp(com, cm_rg)return 'r' void help()printf("欢迎您使用FMS文件系统模拟系统 V1.0");printf("以下是本系统支持的指令:n"); printf("exit : 退出n");printf("help : 帮助n");printf("dir : 查看目录中的所有文件n");printf("create : 新建文件n");printf("delet

18、e : 删除文件n");printf("open : 打开文件n");printf("read : 读文件(必须先打开文件)n");printf("write : 写文件(必须先打开文件)n");printf("close : 关闭文件n");void createBlocksDisk()/初始化磁盘块 FILE* fp = fopen(blockspath, "w");if(fp=NULL)printf("Can not create Disk !nCtrl+C to qu

19、itn");while(1);elseint i, j;for(i=0; i<MAX_BLOCKS_NUM; i+)for(j=0; j<MAX_BLOCK_SIZE; j+)fputc('$',fp);fclose(fp);FILE *p = fopen(fbtpath, "w");if(p=NULL)printf("FBT Created ERROR !n");while(1);elseint i;for(i = 0; i<MAX_BLOCKS_NUM; i+)FBTi = 0;fprintf(p,&quo

20、t; %d",0);fclose(p);dirEntry* isInDir(char *filename) int i;dirEntry *pt = DIR;while(pt!=NULL)if(!strcmpi(pt->ind.filename, filename)return pt;pt = pt->next;return NULL;dirEntry* delHelp(char* filename)dirEntry* res = DIR;if(res=NULL)printf("No files !n");return res;if(res->n

21、ext=NULL)if(!strcmpi(res->ind.filename,filename)DIR = NULL;currEntry=NULL;printf("删除成功!n");return res;elsereturn NULL;if(!strcmpi(res->ind.filename,filename)DIR = res->next;printf("删除成功!n");return res;while(res->next!=NULL)if(!strcmpi(res->next->ind.filename,fil

22、ename)dirEntry* r = res->next;res->next = r->next;printf("删除成功!n");return r;res = res->next;printf("删除失败!n");return NULL;void coverHelp()/释放原数据块,更新FBT int f;if(selectEntry->ind.size!=0) /要size>0 才会分配数据块 for(f=0; f<selectEntry->ind.node_num; f+)FBTselectEnt

23、ry->ind.fatf.num=0;char contentMAX_DATANODE_NUMMAX_BLOCK_SIZE;char tmp;inode ind;printf("End with '$'n");int i = 0;while(tmp=getchar()!='$')if(i=0&&tmp='n')continue;contenti/MAX_BLOCK_SIZEi+ = tmp; ind.size = i;/此时已经结束输入if(i>(MAX_BLOCK_SIZE-1)*MAX_DATA

24、NODE_NUM)printf("文件过大,无法存储,创建失败 !n");return;int k;for(k=0; k<=i/(MAX_BLOCK_SIZE-1);k+)block bk;int bkn;for(bkn=0; bkn<MAX_BLOCK_SIZE-1; bkn+)bk.contentbkn='$'bk.contentMAX_BLOCK_SIZE-1='0'/printf("bk.content: %sn", bk.content);char *tmp;int tp=0;int len=0;if

25、(k=0)if(i<MAX_BLOCK_SIZE-1)len = i;if(k=1)len=i%(MAX_BLOCK_SIZE-1)+1;for(tp=0; tp<len; tp+)bk.contenttp = contentktp;bk.isRevised = true;if(k=0)bk.num = getFreeBlock(false);elsebk.num = getFreeBlock(true);if(bk.num=-1)printf("数据块已用完,内存不足!n");return;saveBlock(bk);ind.fatk.num = bk.num

26、;ind.fatk.begin = 0;ind.fatk.end = len;ind.node_num = k;strcpy(ind.code, selectEntry->ind.code);strcpy(ind.filename, selectEntry->ind.filename);ind.num = selectEntry->ind.node_num;selectEntry->ind = ind;saveDir();saveFBT();printf("文件已保存 !n");void appendHelp()char tmpMAX_BLOCK_S

27、IZE*2;char ch;printf("End with '$':n");int i = 0;while(ch=getchar()!='$')if(i=0&&ch='n')continue;tmpi+ = ch; tmpi='0'/此时已经完成输入if(i+selectEntry->ind.size)>(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)printf("文件过大,无法存储,创建失败 !n");return; elseif(s

28、electEntry->ind.size>MAX_BLOCK_SIZE-1) /已经占用了两个block int offset = selectEntry->ind.size - MAX_BLOCK_SIZE + 1;FILE* bfp = fopen(blockspath,"r+");if(bfp=NULL)printf("DISK ERROR !nFrom appendFile .n");return;elsefseek(bfp,(selectEntry->ind.fat1.num*(MAX_BLOCK_SIZE-1)+off

29、set),SEEK_SET);fwrite(tmp,sizeof(char),i,bfp);fclose(bfp);selectEntry->ind.size = selectEntry->ind.size + i;selectEntry->ind.fat1.end = selectEntry->ind.fat1.end + i;saveDir();printf("文件保存成功 !n");else /只占用了一个block if(i<(MAX_BLOCK_SIZE-1-selectEntry->ind.size) /不会占用新的block

30、 FILE* bfp = fopen(blockspath,"r+");if(bfp=NULL)printf("DISK ERROR !nFrom appendFile .n");return;else/ if(selectEntry->ind.size=0)/ / fseek(bfp,0,SEEK_SET);/ selectEntry->ind.fat0 = 0;/ / else/ / fseek(bfp,(selectEntry->ind.fat0.num*(MAX_BLOCK_SIZE-1)+selectEntry->ind

31、.size),SEEK_SET);/ /printf("ftell = %l",ftell(bfp);fseek(bfp,(selectEntry->ind.fat0.num*(MAX_BLOCK_SIZE-1)+selectEntry->ind.size),SEEK_SET);fwrite(tmp,sizeof(char),i,bfp);fclose(bfp);selectEntry->ind.size = selectEntry->ind.size + i;selectEntry->ind.fat0.end = selectEntry-&g

32、t;ind.fat0.end + i;saveDir();printf("文件保存成功 !n");else /要占用新的block int bkNum = getFreeBlock(true);if(bkNum=-1)printf("数据块已用完,内存不足!n");return;char *p1 = (char*)malloc(MAX_BLOCK_SIZE-1-selectEntry->ind.size)*sizeof(char);char *p2 = (char*)malloc(i-(MAX_BLOCK_SIZE-1-selectEntry-&g

33、t;ind.size)*sizeof(char);int pi;int pn1=0,pn2=0;for(pi=0; pi<i; pi+)if(pi<MAX_BLOCK_SIZE-1-selectEntry->ind.size)p1pn1+ = tmppi;elsep2pn2+ = tmppi;p1pn1 = '0'p2pn2 = '0'/存储FILE *bfp = fopen(blockspath, "r+");if(bfp=NULL)printf("DISK ERROR !nFrom appendFile .n&

34、quot;);return;elsefseek(bfp,(MAX_BLOCK_SIZE-1)*selectEntry->ind.fat0.num+selectEntry->ind.fat0.end),SEEK_SET);fwrite(p1,sizeof(char),pn1,bfp);printf("line near 481n");fseek(bfp,(MAX_BLOCK_SIZE-1)*bkNum),SEEK_SET);fwrite(p2,sizeof(char),pn2,bfp);fclose(bfp);FBTbkNum=1;selectEntry->

35、ind.node_num = 2;selectEntry->ind.size = selectEntry->ind.size + i;selectEntry->ind.fat0.end = MAX_BLOCK_SIZE-2;selectEntry->ind.fat1.num = bkNum;selectEntry->ind.fat1.begin = 0;selectEntry->ind.fat1.end = pn2; saveFBT();saveDir();printf("文件保存成功 !n");/核心函数void create()int

36、 bkNum = getFreeBlock(false);if(bkNum=-1)printf("数据块已用完,内存不足!n");return;char tmp;dirEntry *pt = (dirEntry*)malloc(sizeof(dirEntry);pt->next=NULL;while(1)printf("filename: ");scanf("%s",pt->ind.filename);if(isInDir(pt->ind.filename)!=NULL)printf("文件名已存在 !n请

37、重新输入:n");elsebreak;while(1)printf("Do you want to write the file ?y/n: ");scanf(" %c",&tmp);if(tmp='y')|(tmp='Y')|(tmp='n')|(tmp='N')break;pt->ind.num = curr_inode_num+;/文件保护码不是很懂,因此默认为"rrrwwwxxx"char code10 = "rrrwwwxxx&

38、quot;strcpy(pt->ind.code, code);pt->ind.size = 0;pt->ind.node_num = 0;/初始化,跟存储要相符合 bool isNoBk = false;if(tmp='y'|tmp='Y')char contentMAX_DATANODE_NUMMAX_BLOCK_SIZE;char tmp;printf("End with '$'n");int i = 0;while(tmp=getchar()!='$')if(i=0&&

39、tmp='n')continue;contenti/MAX_BLOCK_SIZEi+ = tmp; pt->ind.size = i;/此时已经结束输入if(i>(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)printf("文件过大,无法存储,创建失败 !n");return;int k;for(k=0; k<=i/(MAX_BLOCK_SIZE-1);k+)block bk;int bkn;for(bkn=0; bkn<MAX_BLOCK_SIZE-1; bkn+)bk.contentbkn='$&

40、#39;bk.contentMAX_BLOCK_SIZE-1='0'/printf("bk.content: %sn", bk.content);char *tmp;int tp=0;int len=0;if(k=0)if(i<MAX_BLOCK_SIZE-1)len = i;if(k=1)len=i%(MAX_BLOCK_SIZE-1)+1;for(tp=0; tp<len; tp+)bk.contenttp = contentktp;bk.isRevised = true;if(k=0)bk.num = bkNum;elsebk.num =

41、getFreeBlock(true);if(bk.num=-1)printf("数据块已用完,内存不足!n");return;saveBlock(bk);pt->ind.fatk.num = bk.num;pt->ind.fatk.begin = 0;pt->ind.fatk.end = len;pt->ind.node_num = k;if(currEntry=NULL)DIR = pt;elsecurrEntry->next = pt;currEntry = pt;saveDir();saveFBT();printf("Succe

42、ed create file %s !",pt->ind.filename);void del()char tmp30;printf("请输入要删除的文件名: ");scanf("%s",tmp);if(isInDir(tmp)=NULL)printf("不存在这个文件。n");return;elsedirEntry *dle = delHelp(tmp);if(dle!=NULL)int i;for(i=0; i<dle->ind.node_num;i+)FBTdle->ind.fati.num=0

43、;saveDir();saveFBT();void open()char file50;printf("请输入文件名: ");scanf("%s",file);selectEntry = isInDir(file);if(selectEntry=NULL)printf("没有这个文件 !n");elseprintf("文件%s已打开,输入close关闭.n",file);int c = 0;while(1)if(c=1)break;switch(getCode()case 5:read();break;case 6

44、:write();break;case 7:close();c=1;break;default:printf("无效的指令n");void read()FILE* bfp = fopen(blockspath,"r");if(bfp=NULL)printf("不存在磁盘文件 !n");while(1);else /打开磁盘文件 int i;char tmp = ' 'printf("文件%s中的内容如下:n",selectEntry->ind.filename);if(selectEntry-

45、>ind.size=0)printf("内容为空。n"); elsefor(i=0; i<selectEntry->ind.node_num; i+)fseek(bfp,(selectEntry->ind.fati.num*(MAX_BLOCK_SIZE-1),SEEK_SET); /这个offset很重要 int j;for(j=selectEntry->ind.fati.begin;j<selectEntry->ind.fati.end;j+)tmp = fgetc(bfp);printf("%c",tmp)

46、;printf("n"); fclose(bfp);void close()selectEntry=NULL;printf("文件已关闭 !n");void write()char sel10;char cm_cover10 = "cover"char cm_append10 = "append"while(1)printf("请输入指令:nappend:在原文件基础上新增数据.ncover:覆盖原数据ncancle:取消n");printf("Command: ");sca

47、nf("%s",sel);if(!strcmpi(sel,cm_cancle)printf("取消 !n");break;if(!strcmpi(sel,cm_cover)coverHelp();break;if(!strcmpi(sel,cm_append)if(selectEntry->ind.size=0)coverHelp();elseappendHelp();break;printf("指令无效n");void initFBT()FILE* fp;fp = fopen(fbtpath, "r");i

48、f(fp=NULL)printf("Can not open FBT files.n");while(1);elseint i=0;while(!feof(fp)fscanf(fp,"%d",&FBTi+);if(i=MAX_BLOCK_SIZE-1)break;int getCode()char cmd10;printf("Command: ");scanf("%s",cmd);if(!strcmpi(cmd, cm_exit)return -1;if(!strcmpi(cmd, cm_help)return 0;if(!strcmpi(cmd, cm_dir)return 1;if(!strcmpi(cmd, cm_create)return 2;if(!strcmpi(cmd, cm_delete)return 3;if(!strcmpi(cmd, cm_open)return 4;if(!strcmpi(cmd, cm_read)r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论