收藏 分享(赏)

成组链接模拟——unix文件系统.doc

上传人:无敌 文档编号:1070855 上传时间:2018-06-09 格式:DOC 页数:14 大小:34.01KB
下载 相关 举报
成组链接模拟——unix文件系统.doc_第1页
第1页 / 共14页
成组链接模拟——unix文件系统.doc_第2页
第2页 / 共14页
成组链接模拟——unix文件系统.doc_第3页
第3页 / 共14页
成组链接模拟——unix文件系统.doc_第4页
第4页 / 共14页
成组链接模拟——unix文件系统.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、问题描述在任一 OS 下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟 UNIX 文件系统 。基本要求 1在现有机器硬盘上开辟 20M 的硬盘空间,作为设定的硬盘空间。2编写一管理程序对此空间进行管理,以模拟 UNIX(linux)文件系统,具体要求如下:(1) 要求盘块大小 1k (2) i 结点文件类型 正规文件目录文件(共 1byte)块设备 管道文件 。物理地址(索引表)共有 13 个表项,每表项 2byte。文件长度 4byte。联结计数 1byte(3)0 号块 超级块 栈长度 50空闲盘块的管理:成组链接 ( UNIX)位示图法 (Linux) (4)每建一个目录

2、,分配 4 个物理块文件名 14byte(5)目录项信息i 结点号 2byte(6)结构: 0#: 超级块1#20#号为 i 结点区20#30#号为根目录区(7)功能: 1、初始化2、建立文件(需给出文件名,文件长度)3、建立子目录4、打开文件(显示文件所占的盘块)5、删除文件6、删除目录7、显示目录(即显示目录下的信息,包括文件、子目录等)8、显示整个系统信息 2、模拟文件系统问题描述在任一 OS 下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的小型文件系统。基本要求该小型文件系统没有子目录机制,文件连续分配,不考虑分区。做一个简单的 操作界面,提供四条简单的命令:简单的 ls、c

3、at 、 cp、rd.进一步增强:上题中的文件系统功能:文件系统不连续分配,可以有子目录 机制,(如两级子目录机制)。附录 课程设计报告内容一实验题目与要求。二总的设计思想及环境说明、工具等。三本题所需数据结构与模块说明。四运行结果与运行情况。五自我评析与总结。1 你认为你完成的哪些比较好或比较出色;2 差距与局限,什么做的不太好或什么地方可以做的更好以待改进;3 从本作业得到的收获:对编写与调试过程中经验教训的总结;4 完成本题的其他方法或你的设想;5 对本实验题的评价和改进意见。#include “stdio.h“ #include #include #include int physic

4、100; /文件地址缓冲区int style=1; /文件的类型char cur_dir10=“root“; /当前目录 struct commandchar com10;cmd12;struct blockint n; /空闲的盘快的个数int free50; /存放空闲盘快的地址int a; /模拟盘快是否被占用memory20449;struct block_superint n; /空闲的盘快的个数int free50; /存放进入栈中的空闲块int stack50; /存放下一组空闲盘快的地址super_block;struct node /i 结点信息int file_style;

5、 /i 结点 文件类型int file_length; /i 结点 文件长度int file_address100; /i 结点 文件的物理地址 i_node640;struct dir /目录项信息char file_name10; /文件名int i_num; /文件的结点号char dir_name10; /文件所在的目录 root640;void format() /格式化int i,j,k;super_block.n=50;for(i=0;i=0;i-)k=physici; /需要提供要回收的文件的地址m=49-super_block.n; /回收到栈中的哪个位置if(super_b

6、lock.n=50) /注意 当 super_block.n=50 时 m=-1;的值 /super_block.n=50 的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中for(j=0;j50;j+)memoryk.freej=super_block.freej;super_block.n=0; memoryk.n=50;memoryk.a=0; if(m=-1)m=49; /将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息 super_block.freem=physici; /将下一个文件地址中的盘块号回收到栈中super_block.n+;void

7、allot(int length) /分配空间int i,j,k,m,p;for(i=0;ilength;i+)k=50-super_block.n; /超级块中表示空闲块的指针m=super_block.freek; /栈中的相应盘块的地址p=super_block.free49; /栈中的最后一个盘块指向的地址if(m=-1|memoryp.a=1) /检测是否还有下一组盘块printf(“内存不足,不能够分配空间n“);callback(length);break;if(super_block.n=1) memorym.a=1; /将最后一个盘块分配掉physici=m;super_bl

8、ock.n=0; for(j=0;jmemorym.n;j+) /从最后一个盘块中取出下一组盘块号写入栈中 super_block.freej=memorym.freej;super_block.n+;continue; /要跳过这次循环,下面的语句在 IF 中已经执行过physici=m; /栈中的相应盘块的地址写进 文件地址缓冲区memorym.a=1; super_block.n-;void create_file(char filename,int length) /创建文件int i,j;for(i=0;i640;i+)if(strcmp(filename,rooti.file_na

9、me)=0)printf(“文件已经存在,不允许建立重名的文件n“);return;for(i=0;i640;i+)if(rooti.i_num=-1)rooti.i_num=i;strcpy(rooti.file_name,filename);strcpy(rooti.dir_name,cur_dir); /把当前目录名 给新建立的文件i_nodei.file_style=style;i_nodei.file_length=length;allot(length);for(j=0;jlength;j+)i_nodei.file_addressj=physicj;break;void crea

10、te_dir(char filename) /创建目录style=0; /0 代表文件类型是目录文件create_file(filename,4);style=1; /用完恢复初值,因为全局变量,否则void del_file(char filename) /删除文件int i,j,k;for(i=0;i640;i+)if(strcmp(filename,rooti.file_name)=0) k=rooti.i_num;for(j=0;ji_nodek.file_length;j+)physicj=i_nodek.file_addressj;callback(i_nodek.file_len

11、gth); /调用 回收函数for(j=0;j100;j+) /删除文件后要将文件属性和目录项的各个值恢复初值i_nodek.file_addressj=-1; /地址恢复初值strcpy(rooti.file_name,“); /文件名恢复初值rooti.i_num=-1; /目录项的 I 结点信息恢复初值strcpy(rooti.dir_name,“); /目录项的文件目录信息恢复初值i_nodek.file_length=-1; /文件长度恢复i_nodek.file_style=-1; /文件类型恢复初值break; if(i=640)printf(“不存在这个文件n“); void

12、del_dir(char filename) /删除目录 需要判断目录下时候为空,不为空就不删除int i,j,k;for(i=0;i640;i+) /还要加条件判断要删除的目录是不是当前目录k=rooti.i_num; /找到目录名字if( strcmp(rooti.file_name,filename)=0 j640;j+)if(strcmp(filename,rootj.dir_name)=0)printf(“目录不为空不能直接删除n“);break;if(j=640)del_file(filename);break;break;if(i=640)printf(“这个不是目录文件 或者不

13、存在这个目录,或者你要删除的是当前目录 n“); void display_curdir() /显示当前目录下的文件列表int i,k;printf(“tt 文件名字 文件类型 文件长度 所属目录n“);for(i=0;i640;i+)if(strcmp(cur_dir,rooti.dir_name)=0) /查询文件中 所在目录信息和当前目录信息相同的数据k=rooti.i_num;printf(“tt %st“,rooti.file_name); /文件名printf(“t%dt“,i_nodek.file_style); /文件的类型printf(“%dt“,i_nodek.file_l

14、ength); /文件的长度printf(“%sn“,rooti.dir_name); /文件所在的目录void display_dir(char filename) /进入指定的目录 int i,k; for(i=0;i640;i+)k=rooti.i_num; /判断文件类型是不是目录类型if(strcmp(filename,rooti.file_name)=0) /将要进入的指定目录设置为当前目录 赋值不要反了 strcpy(目的,源)break;if(i=640)printf(“没有这个目录n“);void open_file(char filename) /打开文件int i,j,k

15、;printf(“tt 文件名字 文件类型 文件长度 所属目录n“);for(i=0;i640;i+)k=rooti.i_num;if(strcmp(filename,rooti.file_name)=0 /文件名printf(“t%dt“,i_nodek.file_style); /文件的类型printf(“%dt“,i_nodek.file_length); /文件的长度printf(“%sn“,rooti.dir_name); /文件所在的目录printf(“tt 文件占用的物理地址n“);for(j=0;ji_nodek.file_length;j+) /显示物理地址 printf(“

16、%d “,i_nodek.file_addressj); /文件具体占用的盘块号printf(“n“);break; if(i=640)printf(“没有这个文件 或者这个文件不是正规文件n“);void back_dir() /返回上一级目录int i,k;for(i=0;i640;i+) /查询和当前目录名相同的目录文件名k=rooti.i_num;if(strcmp(cur_dir,rooti.file_name)=0 /将查询到的目录文件名 所在的目录赋值给当前目录void display_sys() /显示系统信息(磁盘使用情况)int i,m,k=0;for(i=0;i20449;i+)if(memoryi.a=0)k+;m=20449-k;printf(“空闲的盘块数是:t“);printf(“%dn“,k);printf(“使用的盘块数是:t“);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报