虚拟文件系统的实现.docx
- 文档编号:9875497
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:47
- 大小:102.18KB
虚拟文件系统的实现.docx
《虚拟文件系统的实现.docx》由会员分享,可在线阅读,更多相关《虚拟文件系统的实现.docx(47页珍藏版)》请在冰点文库上搜索。
虚拟文件系统的实现
渤海大学
操作系统课程设计
实验报告书
题目:
虚拟文件系统的实现
题目编号:
院系:
软件服务与外包学院
班级:
11级2班
小组成员:
陈镜欢
学号:
111810040
王晨
学号:
111810035
2013-06-30
一、课程设计任务划分
陈镜欢:
主要编写代码熟悉课题的任务和要求,查阅相关文献和资料,并做好编码准备,调试,验收
王晨:
程序编码、调试和测试,书写报告
二、基本原理
2.1主要操作函数
intcreate(char*name);
intopen(char*name);
intclose(char*name);
intwrite(intfd,char*buf,intlen);
intread(intfd,char*buf);
intdel(char*name);
intmkdir(char*name);
intrmdir(char*name);
voiddir();
intcd(char*name);
voidprint();
voidshow();
2.2数据结构
structfatitem/*size8*/
{
intitem;/*存放文件下一个磁盘的指针*/
charem_disk;/*磁盘块是否空闲标志位0空闲*/
};
structdirect
{
/*-----文件控制快信息-----*/
structFCB
{
charname[9];/*文件/目录名8位*/
charproperty;/*属性1位目录0位普通文件*/
intsize;/*文件/目录字节数、盘块数)*/
intfirstdisk;/*文件/目录起始盘块号*/
intnext;/*子目录起始盘块号*/
intsign;/*1是根目录0不是根目录*/
}directitem[MSD+2];
};
structopentable
{
structopenttableitem
{
charname[9];/*文件名*/
intfirstdisk;/*起始盘块号*/
intsize;/*文件的大小*/
}openitem[MOFN];
intcur_size;/*当前打文件的数目*/
};
2.3算法流程图
三、基本思路
3.1设计简介
本系统是模拟实现多用户多目录的文件系统,在系统出现登录后,输入用户与口令,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。
系统的命令与其命令的具体实现,此模拟系统共提供了上述命令,并根据命令的含义与要求,用C++编程来完成所有具体操作。
该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能
3.2设计方案论述
本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:
主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:
file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
3.3文件基本操作
创建文件:
创建一个新文件时,系统首先要为新文件申请必要的外存空间,并在FAT中为文件分配一个目录项。
目录项中应记录新建文件的文件名、文件总容量、当前已经使用的容量、文件属性、文件在磁盘中的起始位置。
删除文件:
当已不在需要某文件时,可将它从文件系统中删除。
在删除时,首先在FAT的文件链表中找到与该文件对应的文件结点,然后确认文件是否处于关闭状态,若以上条件都满足,则系统就可以把结点从文件链表中删除,然后回收改结点对应的磁盘空间。
打开文件:
只有处于打开状态的文件才能被读取、写入、重复关闭且不能被删除。
关闭文件:
只有处于关闭状态的文件才能被删除,且不能被重复关闭。
列文件目录:
用户只能获取自己建立的文件或其他用户共享的文件的列表,并可以查看所用户建立的文件列表。
写文件:
用户可以把相关数据写入到用户自定义的文件中(磁盘上);待写文件必须处于打开状态,且不能是其他用户共享的文件。
读文件:
用户可以把文件中存储的数据读取出来;待读文件必须处于打开状态;用户既可以读取自己建立的文件,也可以读取其他用户共享的文件。
建子目录:
输入目录名,若存在于该文件名相同的目录,这创建失败;若无,则查找空闲的磁盘,将该磁盘置为分配状态,填写目录项,分配地址后,子目录创建成功。
删除目录:
输入名字,查找是否存在该文件或目录,若为文件,则不能删除;若存在,找到起始盘块号,并将其释放,修改目录项,删除成功。
四、调试及实验结果
(1)login用户登录
(2)mkdir创建子目录
(3)cd进出目录
(4)create创建文件
(5)close关闭文件
(6)open打开文件
(7)write写文件
(8)read读文件
(9)dir列目录
(10)delete删除文件
(11)rmdir删除子目录
运行结果分析
从上述运行过程可以看出,用户登录系统后,界面将显示文件或目录的基本操作,然后根据相应操作,完成系统的基本要求。
本次程序的运行结果与预期结果最终达到了一致。
自运行阶段,虽然每次都能得到运行结果,但是操作界面有时不是很完美,于是通过修改程序代码,不断执行程序,进行完善,直到得出满意的操作界面为止。
在该过程中,验证了本次课程设计所要求的基本功能,虽然有些操作不是很完善,但大体上都能实现。
其中最令我不满意的是dir功能。
该功能只是列出目录名,不能显示目录其他信息,是本次课程设计最大败笔。
五、个人体会
课程设计是对我们平时学习的一种考察,我们要正确地对待。
不断地锻炼自己动手动脑的能力、把知识赋予实践就是我们学习的目标!
既然学校给我们这么好的机会,让我们自己在实验室作操作,我们应该好好抓住机会,把我们平时学习的东西用自己的作品展现出来。
这次,给了我们充分锻炼的机会。
我们会用自己学到的东西的设计出一副好的作品。
而对于我们来说,这种最灵活的知识却是最难掌握的。
也因为对其基本知识掌握的不好,在这一次的设计过程中遇到很多的困难,特别是物理盘块和逻辑文件之间的对应。
在经过与同学进行沟通和交流并反复的测试之后,才明白了设计的函数,而且完善了部分函数的主要功能。
通过两星期的操作系统课程设计实习,让我们对Linux文件系统有了深层次的了解和掌握,也通过了自己的能力体会到了编程的乐趣。
最重要的是学会了关于设计分析和以前C语言学习过程中没有及时巩固的知识,对C程序设计又有了更进一步的认识,对一些细节的结构体语句有了更深刻的理解。
所以这是一次很难得的实践机会,让我们真正用心编程,学到了课本以外更深刻更重要的实践经验。
非常感谢老师提供这次机会,在这个课程设计过程中我受益匪浅,希望以后在这样的锻炼中不断成长,提高自己各方面的能力,我们相信通过我们以后很加刻苦的学习,我们会更加热爱我们的专业课程。
附录
主要代码源程序:
#include
#include
#include
#defineMEM_D_SIZE1024*1024//总磁盘空间为M
#defineDISKSIZE1024//磁盘块的大小K
#defineDISK_NUM1024//磁盘块数目K
#defineFATSIZEDISK_NUM*sizeof(structfatitem)//FAT表大小
#defineROOT_DISK_NOFATSIZE/DISKSIZE+1//根目录起始盘块号
#defineROOT_DISK_SIZEsizeof(structdirect)//根目录大小
#defineDIR_MAXSIZE1024//路径最大长度为KB
#defineMSD5//最大子目录数
#defineMOFN5//最大文件深度为
#defineMAX_WRITE1024*128//最大写入文字长度KB
structfatitem/*size8*/
{
intitem;/*存放文件下一个磁盘的指针*/
charem_disk;/*磁盘块是否空闲标志位0空闲*/
};
structdirect
{
/*-----文件控制快信息-----*/
structFCB
{
charname[9];/*文件/目录名8位*/
charproperty;/*属性1位目录0位普通文件*/
intsize;/*文件/目录字节数、盘块数)*/
intfirstdisk;/*文件/目录起始盘块号*/
intnext;/*子目录起始盘块号*/
intsign;/*1是根目录0不是根目录*/
}directitem[MSD+2];
};
structopentable
{
structopenttableitem
{
charname[9];/*文件名*/
intfirstdisk;/*起始盘块号*/
intsize;/*文件的大小*/
}openitem[MOFN];
intcur_size;/*当前打文件的数目*/
};
structfatitem*fat;/*FAT表*/
structdirect*root;/*根目录*/
structdirect*cur_dir;/*当前目录*/
structopentableu_opentable;/*文件打开表*/
intfd=-1;/*文件打开表的序号*/
char*bufferdir;/*记录当前路径的名称*/
char*fdisk;/*虚拟磁盘起始地址*/
voidinitfile();
voidformat();
voidenter();
voidhalt();
intcreate(char*name);
intopen(char*name);
intclose(char*name);
intwrite(intfd,char*buf,intlen);
intread(intfd,char*buf);
intdel(char*name);
intmkdir(char*name);
intrmdir(char*name);
voiddir();
intcd(char*name);
voidprint();
voidshow();
voidinitfile()
{
fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请1M空间*/
format();
}
voidformat()
{
inti;
FILE*fp;
fat=(structfatitem*)(fdisk+DISKSIZE);/*计算FAT表地址,引导区向后偏移1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1;/*引导块*/
fat[0].em_disk='1';
for(i=1;i { fat[i].item=i+1; fat[i].em_disk='1'; } fat[ROOT_DISK_NO].item=-1;/*存放根目录的磁盘块号*/ fat[ROOT_DISK_NO].em_disk='1'; for(i=ROOT_DISK_NO+1;i { fat[i].item=-1; fat[i].em_disk='0'; } /*-----------------------------------------------*/ root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*根目录的地址*/ /*初始化目录*/ /*---------指向当前目录的目录项---------*/ root->directitem[0].sign=1; root->directitem[0].firstdisk=ROOT_DISK_NO; strcpy(root->directitem[0].name,"."); root->directitem[0].next=root->directitem[0].firstdisk; root->directitem[0].property='1'; root->directitem[0].size=ROOT_DISK_SIZE; /*-------指向上一级目录的目录项---------*/ root->directitem[1].sign=1; root->directitem[1].firstdisk=ROOT_DISK_NO; strcpy(root->directitem[1].name,".."); root->directitem[1].next=root->directitem[0].firstdisk; root->directitem[1].property='1'; root->directitem[1].size=ROOT_DISK_SIZE; if((fp=fopen("disk.dat","wb"))==NULL) { printf("Error: \nCannotopenfile\n"); return; } for(i=2;i { root->directitem[i].sign=0; root->directitem[i].firstdisk=-1; strcpy(root->directitem[i].name,""); root->directitem[i].next=-1; root->directitem[i].property='0'; root->directitem[i].size=0; } if((fp=fopen("disk.dat","wb"))==NULL) { printf("Error: \nCannotopenfile\n"); return; } if(fwrite(fdisk,MEM_D_SIZE,1,fp)! =1)/*把虚拟磁盘空间保存到磁盘文件中*/ { printf("Error: \nFilewriteerror! \n"); } fclose(fp); } voidenter() { FILE*fp; inti; fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请1M空间*/ if((fp=fopen("disk.dat","rb"))==NULL) { printf("Error: \nCannotopenfile\n"); return; } if(! fread(fdisk,MEM_D_SIZE,1,fp))/*把磁盘文件disk.dat读入虚拟磁盘空间(内存)*/ { printf("Error: \nCannotreadfile\n"); exit(0); } fat=(structfatitem*)(fdisk+DISKSIZE);/*找到FAT表地址*/ root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/ fclose(fp); /*--------------初始化用户打开表------------------*/ for(i=0;i { strcpy(u_opentable.openitem[i].name,""); u_opentable.openitem[i].firstdisk=-1; u_opentable.openitem[i].size=0; } u_opentable.cur_size=0; cur_dir=root;/*当前目录为根目录*/ bufferdir=(char*)malloc(DIR_MAXSIZE*sizeof(char)); strcpy(bufferdir,"Root: "); } voidhalt() { FILE*fp; inti; if((fp=fopen("disk.dat","wb"))==NULL) { printf("Error: \nCannotopenfile\n"); return; } if(! fwrite(fdisk,MEM_D_SIZE,1,fp))/*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat*/ { printf("Error: \nFilewriteerror! \n"); } fclose(fp); free(fdisk); free(bufferdir); return; } intcreate(char*name) { inti,j; if(strlen(name)>8)/*文件名大于8位*/ return(-1); for(j=2;j { if(! strcmp(cur_dir->directitem[j].name,name)) break; } if(j return(-4); for(i=2;i { if(cur_dir->directitem[i].firstdisk==-1) break; } if(i>=MSD+2)/*无空目录项*/ return(-2); if(u_opentable.cur_size>=MOFN)/*打开文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;j { if(fat[j].em_disk=='0') break; } if(j>=DISK_NUM) return(-5); fat[j].em_disk='1';/*将空闲块置为已经分配*/ /*-----------填写目录项-----------------*/ strcpy(cur_dir->directitem[i].name,name); 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); return0; } intopen(char*name) { inti,j; for(i=2;i { if(! strcmp(cur_dir->directitem[i].name,name)) break; } if(i>=MSD+2) return(-1); /*--------是文件还是目录-----------------------*/ if(cur_dir->directitem[i].property=='1') return(-4); /*--------文件是否打开-----------------------*/ for(j=0;j { if(! strcmp(u_opentable.openitem[j].name,name)) break; } if(j return(-2); if(u_opentable.cur_size>=MOFN)/*文件打开太多*/ return(-3); /*--------查找一个空闲用户打开表项-----------------------*/ for(j=0;j { if(u_opentable.openitem[j].firstdisk==-1) break; } /*--------------填写表项的相关信息------------------------*/ u_opentable.openitem[j].firstdisk=cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name); u_opentable.openitem[j].size=cur_dir->directitem[i].size; u_opentable.cur_size++; /*----------返回用户打开表表项的序号--------------------------*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟 文件系统 实现