没有合适的资源?快使用搜索试试~ 我知道了~
首页Unix文件系统模拟实验报告
Unix文件系统模拟实验报告
5星 · 超过95%的资源 需积分: 11 53 下载量 123 浏览量
更新于2023-03-03
评论 3
收藏 506KB DOC 举报
一.实验任务和说明 这次实验是操作系统大型实验,要完成的任务是模拟unix操作系统中的文件系统功能。在终端界面上用户可以象unix的shell命令一样输入一些命令,如输入ls 显示文件目录,chmod改变文件权限,chown改变文件拥有者,chgrp改变文件所属组,chnam改变文件名,pwd显示当前目录,cd改变当前目录,mkdir创建目录,rmdir删除目录,mk创建文件 ,cp文件拷贝,rm删除文件,cat显示文件内容,login切换用户,passwd修改用户口令 等功能。在后台,要实现混合索引式文件结构,包括用空闲结点号栈管理空闲结点和成组链接发管理空闲盘块。
资源详情
资源评论
资源推荐
Unix 文件系统模拟实验报告
一.实验任务和说明
这次实验是操作系统大型实验,要完成的任务是
模拟 unix 操作系统中的文件系统功能。在终端界面上用户可以象 unix 的 shell 命令
一样输入一些命令,如输入 ls 显示文件目录,chmod 改变文件权限,chown 改变文件拥
有者,chgrp 改变文件所属组,chnam 改变文件名,pwd 显示当前目录,cd 改变当前目
录,mkdir 创建目录,rmdir 删除目录,mk 创建文件 ,cp 文件拷贝,rm 删除文件,cat 显
示文件内容,login 切换用户,passwd 修改用户口令 等功能。在后台,要实现混合索引
式文件结构,包括用空闲结点号栈管理空闲结点和成组链接发管理空闲盘块。
二.实验需求分析、设计思路和总体方案
1.基本思路:
用一个文件(disk.txt)模拟一个物理硬盘, 通过对该文件的一系列操作,模拟
UNIX 文件系统中的文件操作。
2.理磁盘块的设计:
卷盘块数等于 100 块,每个磁盘块 512 字节,磁盘块之间用/n 隔开,总共是 514
字节。0#表示超块,1#--10#放索引结点,每个索引结点占 64 字节,共 80 个索引结
点。初始化是存在根目录 root,占用了 0#结点和 11#盘块。
3.空闲磁盘块:
采用成组链接法管理。每组 10 块,12#--99#分为 9 组,每组的最后一个磁盘块
里存放下一组的磁盘号信息。最后一组只有 8 块,加上 0 作为结束标志。在超块中用一
个一维数组(10 个元素)作为空闲磁盘块栈。放入第一组盘块。
1
4.空闲 I 结点:
采用混合索引式文件结构。索引结点结构中文件物理地址为六项:四个直接块号,
一个一次间址,一个两次间址,其中一次间址和两次间址中一个磁盘块中存放 16 个磁
盘号 。在超块中也用一维数组(80 个元素)作为空闲 I 结点栈,与空闲磁盘块管理不
同的是这里不用采用成组链接法,这一维数组中存放所有 I 结点编号,而且一直保持同
一大小秩序。根目录占 0#索引结点,由于根目录不会删改,是一直占 0#索引结点,
所以我并未按实验指导所说,把它写在超块里,不过写进去也无所谓的。
5.超块,I 结点和目录结构的设计
struct SUPERBLOCK//超块
{
int fistack[80];//空闲结点号栈 setw(3)*80
int fiptr;//空闲结点栈指针(还有多少个) setw(3)
int fbstack[10];//空闲盘块号栈 setw(3)*10
int fbptr;//空闲结点栈指针 setw(3)
int inum;//空闲 i 结点总数 setw(3)
int bnum;//空闲盘块总数 setw(3)
};
struct INODE//i 结点(64B) 已保证了每两个数据之间有空格隔开
{
int fsize;//文件大小 setw(6)
int fbnum;//文件盘块数 setw(6)
int addr[4];//四个直接盘块号(0 ~ 512*4==2048) setw(3)*4
int addr1;//一个一次间址() setw(3)
int addr2;//一个两次间址() setw(3)
char owner[6];//文件拥有者 setw(6)
char group[6];//文件所属组 setw(6)
char mode[11];// 文件类别及存储权限 setw(12)
char ctime[9];//最近修改时间 setw(10)
};
struct DIR//目录项(36B)
{
char fname[14];//文件名(当前目录) setw(15) (0 ~ 14)
int index;//i 结点号 setw(3) (15 ~ 17)
char parfname[14];//父目录名 setw(15) (18 ~ 32)
int parindex;//父目录 i 结点号 setw(3) (33 ~ 35)
};
结点结构中的文件盘块数,目录项结构中的父目录名,父目录 i 结点号,其实可以
2
不要,基本是不用到或是可以不用的,但是当我意识到时,程序已编得差不多了,为了
避免牵一发而动全身,只好留着!
6.用户,密码和组
我的用户组信息是存放在另一个文件(user.txt)中的。
三.各个主要功能模块(函数)的说明
1.main.cpp:
是程序的主函数模块
主函数首先会根据控制文件 control.txt 的头一个位(初始化确定位)来确定是否进
行初始化。如果初始化,那么将只有一个根目录。因为一旦初始化后,初始化确定位就
会置为 0,所以系统只会在第一次进入时初始化,以后都是在前面建立的文件结构上进
行操作的。如果一定要系统初始化时,可把 control.txt 的头一个位置为 1,或者使用命令
“reset”。
进入系统时,当前路径是根目录。然后是登陆请求。登陆后,超块读入内存(由一
个结构对象 superblock 模拟),进入命令解析层,对用户的不同命令执行不同的操作。
退出系统前,把内存的超块再写回 disk.txt。
2.head.h:
是程序的所有全局变量、结构、函数声明的模块。也包括了所有要用到的系统库。
3.blockinodesuperblock.h:
是定义有关超块、结点、盘块、目录项的底层操作函数的模块。
1.对结点的操作:
int ialloc(void);
申请一个 i 结点 返回结点号 否则返回-1。
返回的是空闲结点号栈中最小的结点号,结点用完时返回-1,申请失败。
void ifree(int index);
指定一个结点号,回收一个 i 结点。
先清空结点,然后插入栈中合适位置(必须保持结点号的有序性)。
void readinode(int index,INODE &inode);
读指定的 i 结点( n#结点,读指针应定位到 514+64*n (64B)+2*(n/8) )到 INOE inode
寄存 便于对同一结点的大量操作
3
void writeinode(INODE inode,int index);
把 INODE inode 写回指定的 i 结点
2.对盘块的操作;用的是成组链接法。(n#盘块 读指针应定位到 514*n)
int balloc(void);
申请一个盘块 返回盘块号 否则返回-1
void bfree(int index);
指定一个盘块号,回收一个盘块
3.对超块的操作;
void readsuper(void);
读超块到内存 SUPERBLOCK superblock;
void writesuper(void);
内存 SUPERBLOCK superblock;写回超块
4.对目录项的操作( n#目录项读指针应定位 514*index+36*n )
void readdir(INODE inode,int index,DIR &dir);
读指定目录项进临时对象 DIR dir;
void writedir(INODE inode,DIR dir,int index);
目录项对象 DIR dir 写到指定目录项
4.initial.h:
是定义初始化函数的模块
其中包括了对用户组的初始化:定义三个用户 adm,cnj 和 jtq,其中 adm,cnj 的组为
adm,jtq 的组为 guest。用户的初始密码都为 123。对超块的(0#盘块)初始化 、对根目
录文件结点(0#结点)的初始化 、对数据盘块的初始化。
5.userop.h:
定义了两个功能函数:
1. 登陆 bool login(void); 要求输入用户信息,并判断是否合法。
2. 改变用户密码 void changepassword(void); 改变当前用户的密码。
6. file.h:
定义了有关文件操作的四个函数
1. 创建文件 void mk(char *dirname,char *content);
当前目录下创建一个数据文件(规定目录文件只占 1 ~ 4 个盘块)。虽然不要求这
个函数,但我觉得很有必要。而且,因为我使用了两个参数,前一个表示文件
名,后一个表示文件内容,可以在文件拷贝里使用这个函数。
2. 删除文件 void rm(char *filename);
当前目录下删除指定数据文件
3. 文件拷贝 void cp(char*string);
给定一个路径,把那个文件拷贝到当前目录下。首先要使用 dir.h 里面根据路径找到
4
目标的函数(find(char*string))找到对应文件,如果是数据文件的话,记录文件内
容到一缓冲区,然后在当前目录下调用创建目录的函数,就完成了。
4. 显示文件内容 void cat(char *filename);
显示当前目录下指定数据文件的内容。
7. dir.h:
定义两个底层函数
1. bool havesame(char *dirname,INODE inode,int &i,int &index2)
判断对象 inode 指向的目录文件盘块中有无该名(dirname)的目录项存在着,
有返回 1 无返回 0。同时,有该目录项的话,则按引用调用的 i 为待删子目录目录项
下标 index2 为目录项中的待删子目录的结点号
2. bool find(char *string)
根据路径找到指定文件或目录<路径至少有一个‘/’以 root 开头,不以‘/’结尾>。
需要注意的是,使用此函数时当前路径跟着改掉了,所以使用前必须保存当前路径。
万一找不到目标的话,可以还原为当前路径。
定义了有关目录操作的四个功能函数,
1. void mkdir(char *dirname)
当前目录下创建目录(规定目录文件只占一个盘块。为了降低难度,已设定目录
文件只占一个盘块。
2. void rmdir(char *dirname,int index)
当前目录下删除目录。将要删除的目录可能非空。有两种策略:一、规定只能
删除空目录。二、递归地将非空目录的所有子目录删除,让后再删除自己。第一种
实现较简单,我使用了第二种策略。所以参数为 (子目录名,当前结点)。如果使用第
一种策略的话,参数为只要子目录名就可以了。
3. void ls(void)
显示当前结点的所有子目录
4. void cd(char *string)
改变当前目录。有四中处理过程: string 为“.”切换到当前目录;为“..”
切换到父目录 ;为“/”切换到根目录;如果为一路径的话,就调用 bool find(char
*string) 切换到指定目录。
8. chsome.h:
定义一个底层函数:
bool havewpower(INODE inode)
判断当前用户对指定的结点有无写权限
定义四个功能函数:
1. void chmod(char *name)
改变当前目录下指定文件的文件权限
2. void chown(char *name)
改变当前目录下指定文件的文件拥有者(如拥有者在另一个组,那么组也要改
5
剩余55页未读,继续阅读
a7952113
- 粉丝: 23
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2022年中国足球球迷营销价值报告.pdf
- 房地产培训 -营销总每天在干嘛.pptx
- 黄色简约实用介绍_汇报PPT模板.pptx
- 嵌入式系统原理及应用:第三章 ARM编程简介_3.pdf
- 多媒体应用系统.pptx
- 黄灰配色简约设计精美大气商务汇报PPT模板.pptx
- 用matlab绘制差分方程Z变换-反变换-zplane-residuez-tf2zp-zp2tf-tf2sos-sos2tf-幅相频谱等等.docx
- 网络营销策略-网络营销团队的建立.docx
- 电子商务示范企业申请报告.doc
- 淡雅灰低面风背景完整框架创业商业计划书PPT模板.pptx
- 计算模型与算法技术:10-Iterative Improvement.ppt
- 计算模型与算法技术:9-Greedy Technique.ppt
- 计算模型与算法技术:6-Transform-and-Conquer.ppt
- 云服务安全风险分析研究.pdf
- 软件工程笔记(完整版).doc
- 电子商务网项目实例规划书.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3