logo资料库

一个多用户多级目录结构文件系统设计与实现.doc

第1页 / 共65页
第2页 / 共65页
第3页 / 共65页
第4页 / 共65页
第5页 / 共65页
第6页 / 共65页
第7页 / 共65页
第8页 / 共65页
资料共65页,剩余部分请下载后查看
一、设计思想说明
1 设计环境
2、文件卷的组织
二、系统结构的说明
三、数据结构的说明
四、算法流程图
五、系统调用列表
六、主要函数列表
七、程序清单及注析
八、调试记录
九、使用说明
十、体会
十一、编译方法
操作系统课程设计 一个多用户多级目录结构文件系统设计与实现 姓名 学号 班级 户头名 电话 *** 200145002203003 ***级***班 net15002 85296079 电子邮件地址 iczj@163.com QQ号 5518179 源程序所在路径名 ./filesystem/ 编译环境 运行环境 Linux Linux 超级用户口令 iczj:iczj(用户名:密码) 编译方法 g++ -o filesystem.out filesystem.cpp
一、设计思想说明 1 设计环境 课程设计的环境是Linux 操作系统。 设计时可利用Linux 提供的文件管理的功能调 用,建立一个模拟的文件系统。基本思想是,在Linux 系统中创建一个较大容量的文件,作 为所设计的文件系统的“文件卷”,并利用Linux 系统的功能调用,编写各程序模块。 2、文件卷的组织 以 1M 的存储器空间作为文件空间,空间“分块”,编号为 0#~(BLKMAX-1)# 。“分 块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。分块主要 体现在文件卷的读/写模块上。 # define BSIZE 512 /* 512bytes/块 */ # define BLKMAX 2048 /* 共2048 块 */ 0#块的作用: 0# 块是专用块(超级块)。前半部用于存放文件卷空间的位示图 (bitmap),位状态='0'表示对应块空闲,状态='1'表示已分配。后半部的最后32 个字节用 于存放根目录的目录结构。0#块不参与文件空间的动态分配。1#~(BLKMAX-1)#块用于存放 文件(普通文件和子目录文件)的信息。 二、系统结构的说明 本文件管理系统分为五层,上层调用下层,下层为上层服务。以下为各层(由低到高) 的简要说明: 1、块管理层,通过TBlock类实现 设下列主要函数: balloc()--块分配函数 brelse()--块释放函数 bread()—读一块函数 bwrite()—写一块函数 2、FCB管理层,通过TFcb类实现 功能涉及到FCB结构的操作,定义了一些与FCB操作相关的函数 3、打开文件管理层,通过TOFile类实现 功能为涉及ofile结构的操作。
4、命令解释层,通过TEnter类和TOrder类实现 功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。按系统的的功能 要求,可以Open(),Close(),Read(),Write();等函数。 三、数据结构的说明 用户信息的存储结构: struct UserNode//注册用户信息 { //标识该用户信息是否有效,超级用户为用户数目,-1 表示无效 char d_flag; char d_uid; char d_gid; char d_name[8];/*用户名,但不超过八个字节,超过八位自动截取*/ char password[8];/*用户密码但不超过八位,超过八位自动截取*/ /*用户标识,为 0 时表示是超级*/ /*同组用户标识*/ }; 目录文件结点信息存储结构: struct dir { unsigned short d_mode; //文件属性及访问权限,<=0 时为空结构 char d_uid; char d_gid; int d_fsize; char d_name[8]; int d_add[10]; //文件主标识 //文件主同组用户标识 //文件大小(字节),作为目录结构时为该目录下文件个数 //文件名 //存放文件信息的空间地址(块号) }; Fcb 在内存中的结构: struct SFcb { /*文件访问计数*/ /*标志字*/ /*存放本文件目录结构的块号*/ char f_count; char f_flag; int int f_number; /*文件目录结构所在块内偏移序号*/ unsigned short f_mode; /*文件属性*/ f_blkno; /*以下各项信息在文件打开时从 struct dir 获取*/ char f_uid; char f_gid; int char f_name[8]; int f_add[10]; f_fsize; };
文件目录存储位置存储结构: struct Hfcb//用于 Namei 函数,返回文件目录结构存储位置 { int blkno; int offset; //存放本文件目录结构的块号 //文件目录结构所在块内偏移序号 }; 打开文件结构: struct HOFile { char o_flag; int o_count; struct SFcb* o_fcbp; int o_offset; }; 内存中的用户结点结构: struct TUser { //标志字 //访问计数 //对就打开文件 FCB 结构指针 //文件当前读/写指针 char u_name[8]; char u_uid; char u_gid; struct SFcb *u_cdir; int u_error; //用户名,登录时使用 //用户标识,文件创建时的文件主 //同组用户标识 //现行工作目录标识 //执行文件管理函数时返回的错误代码,创建文件时被用来存储文件 设置 }; //读/写文件时信息存储区始址 //读/写文件时信息字节数 //读/写文件的相对位移量 char*u_base; int u_count; int u_offset; char u_obuf[8]; struct SFcb* u_pdir; struct HOFile *u_ofile[5];//本用户打开文件表 //文件路径名分量暂存区(查找文件时用) //新文件父目录 FCB 指针(文件创建时用)
四、算法流程图 开始 Y 第一次运行? 初始化 N N 用户登陆 登陆成功? Y 接收命令 解析命令 N 退出? 实现命令 Y 结束
五、系统调用列表 系统调用原型 void Cd(string para) void Cd__() void Create(string str) void Del(string para) void Dir() void Exit() void Help() void Md(string para) void Rd(string para) void Set(string para) void Wr(string para) 六、主要函数列表 TFcb::CD(char* TFcb::CD__(TUser TFcb::DelDir(char* TFcb::DelFile(char* TFcb::CreateDir(char* 函数原型 int TBlock::Balloc() bool dirname,TUser& user) bool &user) bool dirname,TUser& user) bool dirname,TUser& user) bool filename,TUser& user) void TFcb::Directory(TUser& user) bool filename,TUser& user) void TBlock::FirstInit(USERINFO info) void TFcb::JustWrRight(char* fname,TUser& user) TFcb::FCFile(char* 功能 设置目录 返回上层目录 创建文件 删除文件 列文件目录 退出系统 输出帮助文件 建立目录 删除目录 调整文件属性 写入文件 功能 块分配 设置文件目录 返回上一级目录 建立一个目录 删除目录 删除文件 获取当前目录信息 创建文件 初始化 入口、出口参数说明 para 为要打开的文件名 str 为要建立的文件的文件名 para 为要删除的文件名 para 为要建立的目录名 para 为要删除的目录名 para 为要调整的文件名 para 为要写入的文件名 入口、出口参数说明 dirname 为目录名,user 为当 前的用户结构指针 user 为当前的用户结构指针 dirname 为目录名,user 为当 前的用户结构指针 dirname 为目录名,user 为当 前的用户结构指针 filename 为文件名,user 为当 前的用户结构指针 user 为当前的用户结构指针 filename 为文件名,user 为当 前的用户结构指针 info 为初始的用户信息结构 实体 判断用户是否对该文件有写 权限 fname 为文件名,user 为当前 的用户结构指针
TFcb::OpenFile(char* TFcb::ReadFile(char* bool fdname,TUser& user) void fname,TUser& user) void flag,TUser& fname) bool TFcb::Write(dir* td) TFcb::SetFile(int user,char* 打开文件 读出文件 更改文件权限 写文件 fdname 为文件名,user 为当 前的用户结构指针 fname 为文件名,user 为当前 的用户结构指针 flag 为新权限标识,fname 为 文件名,user 为当前的用户结 构指针 dir 为文件所在目录的结构 七、程序清单及注析 1、 以下为 block.h 的内容: #include #include #include #include #include #include using namespace std; #define BLOCK 512 #define BLOCKNUM 2048 #define DN 8 #define USERNUM 10 //最大用户数 #define FILENUM 9 //每个块能存储的文件目录结构数量 /*FCB 标志字(f_flag)的各种标志定义为:*/ #define FLOCK 01 /*FCB 访问互斥标志*/ #define FUPD 02 /*本 FCB 代表的文件已修改*/ #define FCHG 04/*本 FCB 结构中某些信息已被修改*/ #define FCBFLAG 05 #define FCBUSE 07 #define OFFLAG 06 #define OFUSE 03 //本 HOfile 结构已被使用 //本 fcb 结构未被使用 //本 fcb 结构已被使用 //本 HOfile 结构未被使用 //文件属性及文件访问权限(即 d_mode 和 f_mode)定义: #define ROOT 111 #define IFROOT 011 //子目录中存储父目录的结构
//文件类型屏蔽字 #define IFMT 0070000 #define IFDIR 0010000 //子目录文件 #define IFREG 0020000//普通文件 #define IREAD 0400 #define IWRITE 0200 #define IEXEC 0100 #define GREAD 040 #define GWRITE 020 #define GEXEC 010 #define OREAD 04 #define OWRITE 02 #define OEXEC 01 #define NONODE 100 //文件主”读"权限 //文件主“写”权限 //文件主“执行”权限 //同组用户“读”权限 //同组用户“写”权限 //同组用户“执行”权限 //其它用户“读”权限 //其它用户“写”权限 //其它用户“执行”权限 inline bool bit_on(unsigned char ui,int pos){return ui&(1<
分享到:
收藏