模拟unix文件系统.doc 37页
模拟unix文件系统一、基本信息完成人:牛娜(2006116242)报告日期:2008-3-24二、试验要求1.文件系统应具有的基本功能(1)多用户 :usr1,usr2 (2个用户)(2)多级目录:具有树形目录结构;(3)具有login (用户登录)和用户身份认证功能;(4)文件的创建: create(5)文件的打开:open(6)文件的读:read(7)文件的写:write(8)文件关闭:close(9)删除文件:delete (10)创建目录(建立子目录):mkdir(11)改变当前目录:cd(12)列出文件目录:dir(列目录时要列出文件名、物理地址和文件长度)(13)退出:logout(14)有文件保护机制,如对文件设置访问权限等(如用户usr1不能对usr2创建的文件进行修改等)。2.选用程序设计语言:C或C++等。3.注意界面友好,有提示信息!三、设计思想说明课程设计所利用的空间为1M的内存(模拟外存文件系统存储空间),模拟外存文件系统存储空间。这1M内存分成512块,每块为512个字节,这512块就是文件系统总共的可用块数,文件系统的分配就是以块为单位来分配的,文件是以成组链接进行管理。 四 相关数据结构说明4.1用来存放用户所能输入的各种命令。 struct command { char com[10]; }cmd[17]; 4.2 模拟的外存文件系统的存储空间,有512块内存,n代表空闲块的个数,free[50]代表存放空闲盘块的地址,a代表模拟的盘块是否被占用。struct block {int n;int free[50];int a;}memory[512] 4.3存放文件的数据体,1M内存中struct file_block{char p[100] ;}fileBlock[] ;4.4 超级块中的数据结构包含用来存放空闲盘块的个数,存放进入栈中的空闲块,下一组空闲盘块的地址。struct block_super { int n;int free[50];int stack[50]; }super_block;4.5文件的i节点信息,它包括文件类型,文件长度,用户对该文件的操作权限,文件中的用户和同组用户和文件的物理地址。 struct node{ int file_style;int file_length; int file_mode ;int file_userid ;int file_groupid ;int file_address[10]; } i_node[512]; 4.6 用来存放目录项的信息,fli_name表示文件名,i_num表示文件的节点号,dir_name表示文件所在的目录。 struct dir { char file_name[10]; int i_num;char dir_name[10]; } root[512];4.7 活动节点,存放节点的个数和节点号struct active_node{struct node file_node ;int i_count ;int i_number ;}ActiveNode[30] ;4.8用户文件表,文件的位置struct user_file_table{int location[15] ;}UserFileTable[2];4.9系统文件表,文件名和共享技术struct system_file_table{char filename[10] ;int pointer ;}SystemFileTable[30] ;五 各模块的流程图 5.1用户登录模块设置用户名和密码,用来验证登录用户的身份,用户登录成功前会初始化当前用户等一系列的系统当前信息,用户的类型为普通用户,如果用户未能通过身份验证,提示用户登失败,可重新登陆两次。5.2创建文件功能只支持在当前目录创建文件,找到个未使用的文件块用来存放用户的文件信息,同时更文件索引i5.3文件打开功能只支持在当前目录进行操作,通过用户给定的文件名进行判断是否是文件,打印出文件的属性。 5.4文件读取功能只支持在当前目录进行操作,只准在已创建的文件中进行写操作unix文件系统,并以D结束输入。 5.5文件的写功能在已经创建好的文件中输入内容,以D结束输入。5.6文件关闭功能只支持在当前目录进行操作,通过用户给定的文件名在文件索引中搜索到文件的物理文件块ID,找到该文件元素后,将文件当前状态置为关闭。 5.7删除文件功能删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为无效5.8创建子目录功能只支持在当前目录创建文件,与创建文件有点类似。5.9改变当前目录功能5.10列出当前目录下的文件,流程图如下:四、程序清单#include "stdio.h" #include #include #include #define G_Read 8//同组用户对文件的读操作权限#define G_Write 4//同组用户对文件的写权限#define G_Delete 2//同组用户对文件的删除权限#define G_Execute 1//对文件有执行的权限,即修改文件权限的权限#define O_Read 128//文件主对文件的读权限#define O_Write 64//文件主对文件的写权限#define O_Delete 32//文件主对文件的删除权限#define O_Execute 16 //对文件有执行的权限,即修改文件权限的权限//定义各个用户#define User1 1#define User2 2intcurrentuser ;//记录当前用户intaddress_buffer[100]; /* 文件地址缓冲区 */intstyle=1;/* 文件的类型 */charcur_dir[10]="root"; /* 当前目录 */charbuffer[100];charuser[10]=" " ;struct command { char com[10];}cmd[17]; struct block { int n;/* 空闲的盘块的个数 */int free[50]; /* 存放空闲盘块的地址 */int a;/* 模拟盘块是否被占用 */}memory[512]; //定义存放文件的数据体struct file_block{char p[512] ;}fileBlock[1536] ;struct block_super { int n;/* 空闲的盘块的个数 */int free[50]; /* 存放进入栈中的空闲块 */int stack[50]; /* 存放下一组空闲盘快的地址 */}super_block; struct node/* i结点信息 */{ int file_style; /* i结点 文件类型 */int file_length; /* i结点 文件长度 */int file_mode ;int file_userid ;int file_groupid ;int file_address[10]; /* i结点 文件的物理地址 */} i_node[512]; struct active_node{struct node file_node ;int i_count ;int i_number ;}ActiveNode[30] ;struct user_file_table{int location[15] ;}UserFileTable[2];struct system_file_table{char filename[10] ;int pointer ;}SystemFileTable[30] ;struct dir/* 目录项信息 */{ char file_name[10]; /* 文件名 */int i_num;/* 文件的结点号 */char dir_name[10]; /* 文件所在的目录 */} root[512]; void InitUserFileTable(){int i ;for( i=0;i= 2)//非法用户{printf("\n对不起,您不是该系统用户,按任意键退出系统。 \n");return 0;}else{return 1;}}void format()/* 格式化 */{ int i,j,k; super_block.n=50; for(i=0;i=0;i--) { k=address_buffer[i];/* 需要提供要回收的文件的地址 */m=49-super_block.n; /* 回收到栈中的哪个位置 */if(super_block.n==50) /* 注意 当super_block.n==50时 m=-1;的值 */{/* super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中 */for(j=0;j (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |