操作系统模拟unix文件系统实验报告.docx
《操作系统模拟unix文件系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统模拟unix文件系统实验报告.docx(42页珍藏版)》请在冰豆网上搜索。
![操作系统模拟unix文件系统实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/12/f1e03d5f-9c74-4636-ad7e-eda4b2a27ea2/f1e03d5f-9c74-4636-ad7e-eda4b2a27ea21.gif)
操作系统模拟unix文件系统实验报告
操作系统大型实验
班级:
学号:
姓名:
一实验介绍……………………………………………………………………
1.实验名称
2.实验目的
3.实验内容及要求
二实验环境……………………………………………………………………
三实验设计……………………………………………………………………
1.数据结构设计
2.系统流程设计
3.实现命令操作
四模块详解……………………………………………………………………
1.文件操作
2.用户操作
五实验演示……………………………………………………………………
1.初始化磁盘块
2.用户登录
3.目录操作
4.文件操作
六源代码………………………………………………………………………
七实验心得体会……………………………………………………………………
1.调试中遇到的问题总结
2.实验感悟
一、实验介绍
1.实验名称
操作系统大型实验
2.实验目的
完成一个UNIX/Linux文件系统的子集的模拟实现,了解Unix文件系统的实现机制。
3.实验内容及要求
(1)文件卷结构设计
0#块可省略
I节点栈及空间为20项
块大小为512字节
卷盘块数大于100
I节点盘块数大于10块
(2)I节点结构设计
文件大小
文件联接计数
文件地址
文件拥有者
文件所属组
文件权限及类别
文件最后修改时间
其中文件地址为六项:
四个直接块号,一个一次间址,一个两次间址
(3)目录结构
用16字节表示,其中14字节为文件名,2字节为I节点号
(4)用户及组结构
用户信息中包括用户名、口令,所属组,用户打开文件表
(5)文件树结构
除(4)要求外,适当考虑UNIX本身文件树结构
(6)实现功能
Ls显示文件目录
Chmod改变文件权限
Chown改变文件拥有者
Chgrp改变文件所属组
Pwd显示当前目录
Cd改变当前目录
Mkdir创建子目录
Rmdir删除子目录
Mv改变文件名
Cp文件拷贝
Rm文件删除
Ln建立文件联接
Cat连接显示文件内容
Vi文件写入
Mk创建文件
umask查看用户屏蔽码
Umask文件创建屏蔽码
Passwd修改用户口令
Ls-l查看文件类型
Login用户注销
Logout退出系统
Help显示帮助信息
二、实验环境
实验设备:
MicrosoftVisualStudio2010
开发语言:
c++
三、实验设计
1.数据结构设计
磁盘文件结构设计:
用一个名为disk.txt的文件模拟Unix系统磁盘,总共分为200块,每块514个字节(实际可用512个字节,还有2个字节是磁盘分割符‘\n’),使第一块(0#)盘块做为超级块,记录该系统磁盘的使用情况;第二块(1#)盘块——第十三块(12#)盘块作为存储I结点使用,每个I结点74个字节,所以每个盘块可以存放6个I结点,总共有72个I结点,记录在超级块中;十三块(12#)以后的盘块作为存储文件内容使用,总共187个盘块,用成组连接法记录在超级块中。
对于I结点的具体设计如下:
classINode//(74B)
{
public:
intfsize;//文件大小setw(6)
intfbnum;//文件盘块数setw(6)
intaddr[4];//四个直接盘块号文件最大为4*512=2048=2KBsetw(4)*4
intaddr1;//一个一次间址()文件大于2KB,小于2KB+16*512=10KBsetw(4)
intaddr2;//一个两次间址()文件大于10KB,小于10KB+16*16*512B=138KBsetw(4)
charowner[6];//文件拥有者setw(6)
chargroup[6];//文件所属组setw(6)
charmode[12];//文件类别及存储权限setw(12)
charctime[10];//最近修改时间setw(10)
intconnect;//文件联接计数
};
对于超级块的具体设计如下:
classsuperBlock
{
public:
intFIStack[72];//空闲结点号栈setw(3)*72
intFICount;//空闲i结点总数setw(3)
intFIPtr;//空闲结点栈指针setw(3)
intFBStack[10];//空闲盘块号栈setw(4)*10
intFBCount;//空闲盘块总数setw(4)
intFBPtr;//空闲盘块栈指针setw(3)
};
初始化磁盘示意图:
14#
13#
1
2
除了超级块、I结点、磁盘文件的数据结构设计以外,为了系统操作方便,我还设计了用户类、文件目录类。
用户类具体设计:
classUSER//用户(24B)
{
public:
charname[6];//用户名setw(6)
charpass[6];//密码setw(6)
chargroup[6];//所属组setw(6)
intumask[3];//用户umask码setw(6)
};
用户信息全部存放在一个user.txt的文件里面,所以对于user.txt文件也有一个设计,文件最开始是存放用户总数(setw(6)),随后跟着的是每一位用户名、密码、所属组、用户umask码。
文件目录类具体设计:
classCatalog//目录项(18B)
{
public:
charfname[14];//文件名setw(14)
intindex;//i结点号setw(4)
};
目录信息全部都存放在disk磁盘里面,所以具体数据结构设计都在上面的磁盘文件设计中提及。
2.程序流程设计
◆系统主体流程图设计见图1
◆用户注册流程图见图2
◆登陆功能流程图见图3
◆用户修改口令流程图见图4
◆用户umask码修改流程图见图5
◆显示所有子目录ls操作流程图见图6
◆创建文件mk、目录mkdir流程图见图7
◆删除文件rm流程图见图8
◆删除目录文件rmdir流程图见图9
◆改变当前路径cd操作流程图见图10
◆查看文件内容cat操作流程图见图11
◆拷贝文件、目录cp操作流程图见图12
◆建立文件联接ln操作流程图见图13
◆修改文件名称MV操作流程图见图14
◆修改文件权限chmod操作流程图见图15
◆修改文件拥有者chown、所属组chgrp操作流程图见图16
◆写流程图vi见图17
N
N
N
Y
Y
Y
Y
N
N
N
Y
Y
Y
Y
Y
Y
N
N
N
3.实现命令操作
cd[enter].[enter]切换到当前目录
cd[enter]/[enter]切换到根目录
cd[enter]..[enter]切换到父目录
cd[enter]dir[enter]切换到某一子目录,dir为子目录名
cd[enter]string[enter]切换到指定路径的目录,string为路径
mkdir[enter]dir[enter]当前目录下创建名为dir的子目录
rmdir[enter]dir[enter]删除当前目录下名为dir的子目录
mk[enter]file[enter]当前目录下创建名为file的文件
rm[enter]file[enter]删除当前目录下名为file的文件
cp[enter]dirORfile[enter]string[enter]拷贝当前目录下文件或子目录到指定路径下
cat[enter]file[enter]查看当前目录下名为file的文件内容
vi[enter]file[enter]向当前目录下名为file的文件写入一定内容
pwd[enter]显示当前目录
ls[enter]显示所有子目录
chmod[enter]file[enter]改变当前目录下名为file文件的权限
chown[enter]file[enter]改变当前目录下名为file文件的拥有者
chgrp[enter]file[enter]改变当前目录下名为file文件的所属组
MV[enter]file[enter]改变当前目录下名为file文件的文件名
login[enter]用户注销,可以重新登陆
passwd[enter]用户改变密码
umask[enter]查看用户umask码
Umask[enter]code[enter]修改用户umask码为code
ln[enter]file1[enter]file2[enter]文件file1与file2建立连结
ls-l[enter]file[enter]查看文件file的类别
help[enter]提供帮助
logout[enter]退出系统
四、模块详解
1.文件操作
◆mk创建文件模块,输入mk命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的数据文件。
在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。
具体流程图查看第二节,系统流程图设计部分。
◆rm删除文件模块,输入rm命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。
在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。
具体流程图查看第二节,系统流程图设计部分。
◆mkdir创建目录文件模块,输入mkdir命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。
在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。
具体流程图查看第二节,系统流程图设计部分。
◆rmdir删除目录文件模块,输入rmdir命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的目录文件。
在该删除过程中要判断该目录中是否存在该目录文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。
删除的时候要判断该目录是否为空,如果里面有内容,则要通过递归函数,将他们一并删除了。
具体流程图查看第二节,系统流程图设计部分。
◆cp拷贝文件模块,输入cp命令,回车,输入要拷贝文件的文件名,回车,输入要拷贝到哪个路径下面,即会在该路径下创建一个名为与被拷贝文件名相同的数据文件(目录文件),并且指向盘块里面的内容都相同的数据文件(目录文件)。
在该拷贝过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有拷贝文件的权限,有权限才可以拷贝。
然后要查看该路径是否存在,存在该路径才可以在该路径下创建拷贝过来的文件,具体流程图查看第二节,系统流程图设计部分。
◆cat显示文件