1、操作系统文件系统设计文档 操作系统实习 题目: 文件系统模拟设计 姓名: 温先良 班级: 计本08-1班 学号: 3081817124 指导老师: 葛云生操作系统实习 11. 引言 21.1 设计目的 21.2实验内容 21.3 系统开发 运行环境 3二 系统分析设计 32.2 基本原理 32.3 数据结构设计 42.4 程序流程图 5三 程序代码以及运行结果 5四 实习心得体会 10五 参考文献 111. 引言 1.1 设计目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 。1.2实验内容 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实
2、现下列几条命令(至少4条); dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。提示: (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2.并以编号作为物理地址,在目录中进行登记1.3 系统开发 运行环境 Windows XP 系统, Visual C+ 6
3、.0二 系统分析设计 2.2 基本原理本系统是模拟实现多用户多的文件系统,在系统出现登录后 ,输入用户与口令,在用户登录系统后,可以添加2个普通用户。普通用户的命令与系统管理员的系统命令具体实现是一样的。此模拟系统提供了10个命令,并根据命令的含义与要求,用C/C+编程来完成所有具体操作。该系统可以模拟完成用户的登陆和验证,新建文件,打开文件,读文件,写文件,关闭文件,删除文件,查看文件,退出系统,注销用户,切换用户等系统功能。2.3 数据结构设计 系统管理员typedef struct user /系统管理员 char name5 ; / 登录用户名 char password10 ; /
4、登录密码user;用户文件目录struct UFD char fname5;/文件名 char proper2;/文件属性 ,R或RW int length;/记录长度 int addr;/文件地址 ; 用户已打开文件表struct UOF char fname5;/文件名 char proper2;/文件属性,r或rw int length;/记录长度 char state5; /状态: new, open int read; /读指针 int write; /写指针 ; 主文件目录struct MFD char Username5;/用户名 struct UFD UserDirecL;/用
5、户文件目录 struct UOF OpenUserS;/已打开文件目录 int count; /每个用户拥有的存在的文件计数 MFDN; 2.4 程序流程图 失败 重新登录成功 用户命令三 程序代码以及运行结果系统管理员登陆以及验证:bool login(char *name, char *pwd ) if( (strcmp(name, admin.name)=0) & (strcmp(pwd, admin.password)=0) return true; return false; 创建新用户bool NewUser(char user) int i=0; while(strcmp(MFD
6、i.Username,)!=0&(i=N) /如果用户数已满 cout用户数已满. 你必须删除一个用户才继续新建用户endl; return 0; else /如果用户数未满,则建立新用户 strcpy(MFDi.Username,user); NOU+;/用户数加1 cout 用户 user 创建成功 .endl;/提示当前用户创建成功 cout 系统现有的用户数 : NOUendl;/显示系统现有的用户数 return 1; 注销用户void Logout(int a) /注销用户,清除所有文件的登记栏 string str; char temp5=; for(int i=0;iL;i+)
7、 /对 UFD中的文件名MFDa.UserDireci.fname进行处理 str=static_cast(MFDa.UserDireci.fname); strcpy(MFDa.UserDireci.fname,str.substr(0,4).c_str(); for(int j=0;jS;j+) /如果UFD中的文件名与UOF中的文件名相同 /对UOF中的文件名UOFi.fname进行处理 str=static_cast(MFDa.OpenUserj.fname); strcpy(MFDa.OpenUserj.fname,str.substr(0,4).c_str(); /清除UOF中信息
8、 if(strcmp(MFDa.UserDireci.fname,MFDa.OpenUserj.fname)=0) strcpy(MFDa.OpenUserj.fname,); /清除UOF中文件名 strcpy(MFDa.OpenUserj.proper,);/清除UOF中文件属性 MFDa.OpenUserj.length=0; /清除UOF中记录长度 strcpy(MFDa.OpenUserj.state,); /清除UOF中文件状态 MFDa.OpenUserj.read=0; /清除UOF中读指针 MFDa.OpenUserj.write=0; /清除UOF中写指针 /清除UFD中信
9、息 strcpy(MFDa.UserDireci.fname,);/清除UFD中文件名 strcpy(MFDa.UserDireci.proper,);/清除UFD中文件属性 MFDa.UserDireci.length=0;/清除UFD中记录长度 MFDa.UserDireci.addr=0; /清除UFD中文件地址 strcpy(temp, MFDa.Username); strcpy(MFDa.Username,);/清除MFD中的用户名 MFDa.count=0; /该用户下的文件数清零 NOU-;/用户数减1 cout 用户 temp 注销成功endl; /提示注销成功 cout 系
10、统当前用户数: NOUendl; 新建文件void Create(int a) int i=0; char filename5;/文件名 char property3;/文件属性 char temp2; /文件属性的临时变量 string str;/临时变量 Re: cout请输入创建文件名(长度为 4) 文件属性(r,rw):endl;/提示输入 coutfilename; if(strlen(filename)4) goto Re;/如果文件名长度不符合要求,则要求重新输入 loop: coutproperty; strcpy(temp,property);/将属性字符串 赋值给temp
11、if(!(strcmp(temp,rw)=0|strcmp(temp,r)=0)/检查属性是否正确 cout文件属性设置错误. 请重新设置: r or rwendl;/属性错误,重新输入 goto loop; /对文件名filename进行处理 str=static_cast(filename); strcpy(filename,str.substr(0,4).c_str(); /对MFDa.UserDireci.fname文件名进行处理 str=static_cast(MFDa.UserDireci.fname); strcpy(MFDa.UserDireci.fname,str.subst
12、r(0,4).c_str(); while(strcmp(MFDa.UserDireci.fname,filename)!=0)&(iL) /*查用户的UFD,检测该文件是否重名*/ i+; str=static_cast(MFDa.UserDireci.fname); strcpy(MFDa.UserDireci.fname,str.substr(0,4).c_str(); if(i=L) /无重名文件 if(MFDa.count=L)/如果用户文件目录UFD已满,则提示文件满的信息 cout 用户MFDa.Username 文件目录UFD已满.endl; /当用户文件目录UFD未满时 el
13、se int j=0; int k=0; while(strcmp(MFDa.UserDirecj.fname,)!=0&(jL) /*在UFD中寻找空登记栏,并登记*/ j+; MFDa.count+; /用户的文件计数器加1 strcpy(MFDa.UserDirecj.fname,filename); /UFD中登记文件名 MFDa.UserDirecj.length=Record;/UFD记录长度 strcpy(MFDa.UserDirecj.proper,temp);/UFD中文件属性 srand(unsigned)time(NULL); /产生随机数 i=rand()%100;/
14、找一磁盘空闲块并赋值给i MFDa.UserDirecj.addr=i;/在UFD登记栏中置文件地址为i /提示文件在UFD中建立成功 cout 文件: filename 已经成功建立 n 文件数量: MFDa.countendl;/显示建立成功 while(strcmp(MFDa.OpenUserk.fname,)!=0&(kS) /*在UOF中寻找空登记栏*/ k+; /如果用户已打开文件表UOF未满 if(kS) /在UOF中登记文件的相关信息 strcpy(MFDa.OpenUserk.fname,filename); /UOF中文件名 MFDa.OpenUserk.length=Re
15、cord;/UOF中记录长度 strcpy(MFDa.OpenUserk.proper, temp);/UOF中文件属性 strcpy(MFDa.OpenUserk.state,new);/修改状态为建立 MFDa.OpenUserk.write=i;/修改写指针为i /提示文件在UOF中建立成功 / cout 文件: filename 已经成功打开 nendl; /如果用户已打开文件表UOF已满,提示文件满的信息 else / cout用户已打开文件表UOF已满. endl; else /提示文件同名,不能建立 cout文件同名 不能建立endl; 打开文件 写文件读文件删除文件系统帮助命令
16、四 实习心得体会 这次操作系统实习为期三周的学习时间,虽然时间比较短,但是还是有点收获的。实习之前,是操作系统课程学习,学习的都是课本的理论知识。在没有接触操作系统课程之前,个人的见识真是少啊。 我以为操作系统就是 Windows XP 这么一种操作系统,还没想到操作系统竟然还有这么多的呢。课堂上讲的操作系统就是Linux 操作系统,可是课本的理论知识学习的比较模糊,很多概念都不理解。经过这次操作系统实习之后,个人在虚拟机里 不断的练习 Linux系统各种命令。由于个人这次实习,所选的题目是:文件系统模拟设计,所以个人在这方面操作比较多,经常动手练习那些Linux系统常用的文件系统命令,逐渐熟悉理解了这个文件系统的各种命令。不过,对于Linux系统 还有很多知识是不懂的,如果将来打算从事Linux系统软件开发的哇,那么还是需要慢慢学习Linxu系统的。 通过这次实习,促使个人开始接触了解这个Linux系统,也对Linux系统有了一点兴趣。五 参考文献现代操作系统 (第2版)作者: (荷)Andrew S. Tanenbaum 作译者介绍 译者: 陈向群 马洪兵 出版社:机械工业出版社