# 一、实验介绍
实验要求大家完成一个 UNIX文件系统的子集的模拟实现。实验的提示与要求:
文件卷结构设计
- 节点栈及空间为20项 i节点栈为保存在内存中的i节点数目吗,用栈的形式保存
- 或者是空闲节点栈
- 块大小为512字节
- 卷盘块数大于100
- I节点盘块数大于10块
- I节点结构设计
- 文件大小
- 文件联接计数
- 文件地址
- 文件拥有者
- 文件所属组
- 文件权限及类别
- 文件最后修改时间
- 其中文件地址为六项:四个直接块号,一个一次间址,一个两次间址
- 目录结构
- 用16字节表示,其中14字节为文件名,2字节为I节点号
- 用户及组结构
- 用户信息中包括用户名、口令,所属组,用户打开文件表
- (文件树结构应与用户相对应:有每个用户的HOME目录)
- 组信息中可只包含组名
- 文件树结构
- 除(4)要求外,适当考虑UNIX本身文件树结构
- 实现功能如下命令
- Ls 显示文件目录
- Chmod 改变文件权限
- Chown 改变文件拥有者
- Chgrp 改变文件所属组
- Pwd 显示当前目录
- Cd 改变当前目录
- Mkdir 创建子目录
- Rmdir 删除子目录
- Umask 文件创建屏蔽码
- Mv 改变文件名
- Cp 文件拷贝
- Rm 文件删除
- Ln 建立文件联接
- Cat 连接显示文件内容
- Passwd 修改用户口令
- 可考虑构造一个简单的编辑器,用于创建文件
- 需要创建“sbinfo”命令查看超级块里面数据块内容
- 空闲盘块栈
- Inode使用情况
- …..
# 二、实验环境
- 操作系统:windows 10 64位
- 开发工具:visio studio 2019
- 程序类型:win32控制台应用程序
# 三、实验设计
## 3.1 系统流程
![](https://www.writebug.com/myres/static/uploads/2021/10/26/c00f53fab7333adacf5eddb2572f7b17.writebug)
- 图3.1.1系统流程图
- 程序开始后先加载资源文件virtualDisk.da文件,将文件指针赋给全局变量virtualDisk(fstream)类型,以便后续文件的读写。
- 然后读取存储在盘块号为0中的superBlock的内容,赋给全局变量superBlock
- 然后读取InodeID为0的root节点,赋给全局变量root。
进行登录,系统首先读取root目录下第一个文件的内容,该文件文件名为user,里面存放了用户的数据结构,放在全局变量users数组,之后读取用户输入的用户名和密码,与users中的用户信息进行比对,若匹配则登录成功,若不匹配则显示用户名密码错误,重新登录。
登录成功后进入命令行界面,通过辨析用户输入的指令调用不同的函数,完成用户的请求。当用户输入exit时退出系统。
## 3.2 文件结构
![](https://www.writebug.com/myres/static/uploads/2021/10/26/b0cbd2267457d1d122296d4bc7f57489.writebug)
图3.2.1文件结构图
虚拟磁盘一共16MB,一个盘块512字节,一个Inode节点128字节,所以一个盘块里存放4个Inode,所以1/4的盘块(6653个盘块)用来存放Inode,3/4的盘块用来存放文件数据(26212个盘块)
## 3.3 实现命令操作
- 本程序主要实现了以下命令操作
- ls 显示文件目录
- ll 显示文件目录里文件和文件的详细信息
- mkdir 创建一个空目录
- rmdir 递归删除目录里的内容以及目录本身
- mv 移动目录及文件到指定目录,并指定文件名
- cp 复制文件到指定目录
- cat 连接显示文件内容,当后跟一个>时表示新建一个文件,
- 并输入内容,当后跟>>时,表示在现有文件后面追加内容
- cd 改变当前目录
- cpdir 复制目录及目录下的文件到指定目录下,并指定新的目录
- 名
- chmod 修改文件权限
- chown 改变文件拥有者
- chgrp 改变文件所属组
- pwd 显示当前目录
- passwd 修改当前用户口令
- ln 为文件创建硬链接
# 四、数据结构
## 4.1 超级块数据结构
块为超级块。磁盘的回收和索引节点的分配与回收将涉及到超级块,超级块是用于专记录空闲盘块与空闲节点使用情况的一个盘块,其中含有以下字段
- disksize:虚拟磁盘的大小,以字节为单位
- freeBlock[FREE_BLOCK_NUM]:空闲盘块栈,记录当前可用空闲盘块号的栈,用成组链接法管理。
- freeBlockIndex:空闲盘块栈的指针,记录下一个可用空闲盘块的下标
- freeTotalBlock:当前文件系统全部可用空闲盘块的数目
- freeInode[FREE_INODE_NUM]:空闲节点栈,记录当前可用空闲节点编号的栈
- freeInodeInde:空闲节点栈的指针,记录下一个可用空闲节点的下标
- freeTotalInode:当前文件系统全部可用空闲节点的数目
- lastLoginTime:上次登录的时间
- umask:权限掩码,创建文件或目录时他们的权限为默认权限减去umask
```c++
class SuperBlock {
public:
unsigned int diskSize;
unsigned int freeBlock[FREE_BLOCK_NUM];
int freeBlockIndex;
unsigned int freeTotalBlock;
unsigned int freeInode[FREE_INODE_NUM];
int freeInodeIndex;
int freeTotalInode;
long int lastLoginTime;
char umask[UMASK_SIZE];
};
```
## 4.2 节点数据结构
关于索引节点,程序中有两种结构的定义,分别是内存索引节点和磁盘索引节点,当磁盘索引节点加载到内存时为其增加一个InodeID(索引节点号)属性。
磁盘索引节点:
- fileSize:文件大小,以字节为单位
- fileLink:文件连接数
- addr[6]:盘块地址数组
- owner:所属用户名
- group:所属用户组
- mode:文件类型及权限
- modifiedTime:上次修改时间
结构定义:
```c++
class Finode {
public:
long int fileSize;
int fileLink;
int addr[6];
char owner[OWNER_MAX_NAME];
char group[GROUP_MAX_NAME];
int mode;
long int modifiedTime;
char blank[48];
};
```
内存索引节点:
- finode:磁盘索引节点结构,保存从磁盘读出的索引节点信息
- inodeID:索引节点号
- 结构定义
```c++
class Inode {
public:
Finode finode;
unsigned short int parentInodeID;
unsigned short int inodeID;
};
```
## 4.3 文件数据结构
文件目录项:
- inodeID:索引节点号
- directEntryName[DIRECT_MAX_NAME]:目录项名
- 结构定义
```c++
class DirectEntry {
public:
unsigned short int inodeID;
char directEntryName[DIRECT_MAX_NAME];
};
```
## 4.4 目录数据结构
目录结构:
directEntryNum:目录项数目
```c++
directEntry[ENTRY_NUM_IN_BLOCK]
```
结构定义:
```c++
class Direct {
public:
int directEntryNum;
DirectEntry directEntry[ENTRY_NUM_IN_BLOCK];
};
```
# 五、模块详解
## 5.1 文件操作
关于文件,本系统主要实现了以下操作:
chgrp 改变文件所属组:
**命令格式:**chgrp [组名] [文件名]
**命令功能:**通过chgrp命令可以改变文件的所属用户组名,此用户组名必须是已经存在的用户组。使用权限是超级用户。
**命令参数:**
[组]:用户组名称
[文件]:当前目录下的文件名称
chown 改变文件拥有者:
**命令格式:**
chown [用户名][文件名]
**命令功能:**
通过chown命令改变文件的所属用户名,此用户名必须是已经存在的用户名。使用权限是超级用户
**命令参数:**
[用户名]:要更改的新的用户名
[文件]:当前目录下的文件名
chmod 改变文件权限:
**命令格式:**
chmod [mode] [文件名]
**命令功能:**
chmod命令用于不同用户和用户组对文件或目录的访问权限。用它控制文件或目录的访问权限。
命令参数:
- [mode] 文件权限码
- r=4,w=2,x=1
若要rwx属性则4+2+1=7
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
- mode权限码一共有三位数字分别代表所属用户,所属用户组和其他用户对其拥有的权限。
- 例如764则代表该文件所属用户对该文件拥有
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实验要求大家完成一个 UNIX文件系统的子集的模拟实现。实验的提示与要求: 文件卷结构设计:0#块可省略;I节点栈及空间为20项 i节点栈为保存在内存中的i节点数目吗,用栈的形式保存;或者是空闲节点栈;块大小为512字节 卷盘块数大于100;I节点盘块数大于10块; I节点结构设计:文件大小;文件联接计数;文件地址;文件拥有者;文件所属组;文件权限及类别;文件最后修改时间;其中文件地址为六项:四个直接块号,一个一次间址,一个两次间址; 目录结构:用16字节表示,其中14字节为文件名,2字节为I节点号; 用户及组结构:用户信息中包括用户名、口令,所属组,用户打开文件表(文件树结构应与用户相对应:有每个用户的HOME目录);组信息中可只包含组名; 文件树结构:适当考虑UNIX本身文件树结构 实现功能如下命令: Ls 显示文件目录 Chmod 改变文件权限 Chown 改变文件拥有者 Chgrp 改变文件所属组 Pwd 显示当前目录 Cd 改变当前目录 Mkdir 创建子目录 Rmdir 删除子目录 Umask 文件创建屏蔽码 Mv 改变文件名 Cp 文件
资源推荐
资源详情
资源评论
收起资源包目录
100011206-基于C语言实现的UNIX文件系统的子集的模拟实现.zip (10个子文件)
unixcmaster
LICENSE 1KB
操作系统课程设计-软工1704-201706062013-高源.docx 1.21MB
源码
define.h 291B
操作系统课程设计-软工1704-201706062013-高源.docx 1.7MB
error.h 205B
dataStruct.h 1002B
UnixFileSystem.cpp 547B
virtualDisk.dat 16MB
fileSystemImplements.h 106KB
README.md 18KB
共 10 条
- 1
资源评论
神仙别闹
- 粉丝: 2671
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 关于mybatis的一些相关资源
- 关于mybatist的一些相关资源
- uni-app实战社区交友类app开发&带视频教程
- mybatis动态sql的一些相关资源
- 隐马尔可夫模型在期货市场的应用_曾琦裕 (1).caj
- 极域解控和极域反控!!!
- 安卓android-serialport-api 串口demo源代码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功