unix文件系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟Unix文件系统寒假实践报告
学号:19212122
班级:计科121
姓名:单旭
组长:顾建东
课程设计具体进展:
以初步完成设计及代码编写,需要进行进一步的调试和完善。
具体设计:
【课设原理】
UNIX采用树型目录结构,每个目录表称为一个目录文件。
一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下:
i节点区文件存储区
本次课程设计是要实现一个简单的模拟UNIX文件系统。我们在磁盘中申请一个二进制文件模拟UNIX内存,依次初始化建立位示图区,I节点区,数据块区。并给已打开的文件建立文件打开表。
设计思想:
先建立512个块,每个块对应512个字节,在建立一个有512个元素的字符数组,每个元素对应相应的块号,不管是文件或是目录都有I节点,建立自己设定数目元素的I节点表,并依次把位图区,I节点表,数据块区每个元素映射到一个二进制文件上。在每一次的操作中如果相应元素有变动,则对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据。
数据结构:
//用户
typedef struct
{
char user_name[10]; // 用户名
char password[10]; // 密码
} User;
//i节点
typedef struct
{
short inum; // 文件i节点号
char file_name[10]; // 文件名
char type; // 文件类型
char user_name[10]; // 文件所有者
short iparent; // 父目录的i节点号
short length; // 文件长度
short address[2]; // 存放文件的地址
} Inode;
//打开文件表
typedef struct
{
short inum; // i节点号
char file_name[10]; // 文件名
short mode; // 读写模式(1:read, 2:write,
// 3:read and write)
} File_table;
设计的功能:
1.format模块
功能:
格式化文件系统,即初始化文件系统,相当于硬盘的格式化。将其中原有的用户及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。
2. get_blknum和release_blk模块
功能:
get_blknum找到一个空闲数据块,并修改对应位图号元素为1。
release_blk修改对应的位图元素,并把文件系统中对应的数据块清零。
3. init()模块
功能:读入文件系统
4.quit()模块
功能:退出系统
5 .creat()模块
功能:
创建文件,分配一空目录项,分配磁盘块。可用位示图。填写该空目录项。如文件长度(0),文件名,类型等。
6. open()模块
功能:
打开文件,并判断文件类型和打开方式。如果文件没有在文件打开表中就在文件打开表中建立该文件项。
7. close()模块
功能:
关闭文件,删除该文件的用户打开文件表目。
8. write()模块
功能:
写文件,需要先打开文件。并判断文件权限。写完后修改文件系统中的对应数据区。
9. read()模块
功能:读文件。需先打开文件。读入相应数据块的内容到缓冲区,然后输出。
10.delet()模块
功能:
如果参数是文件则删除文件,如果是目录则删除该目录下的所有文件和目录。
11.mkdir()
功能:建立新的目录,先在I节点表中找到一个未使用的,并初始化该I节点,并在文件系统中对应更新输出。
12.cd()
功能:将当前目录切换到当前目录的一个子目录下或当前目录的父目录。
具体的函数名及其功能:
void format(void) //创建映像hd,并将所有用户和文件清除
void login(void) // 功能: 用户登陆,如果是新用户则创建用户
void init(void) // 功能: 将所有i节点读入内存
int analyse(char *str) // 功能: 分析用户命令, 将分析结果填充argc和argv
void save_inode(int num) // 功能: 将num号i节点保存到hd.dat
int get_blknum(void) // 功能: 申请一个数据块
void read_blk(int num) // 功能: 将i节点号为num的文件读入temp
void write_blk(int num) // 功能: 将temp的内容输入hd的数据区
void release_blk(int num) // 功能: 释放文件块号为num的文件占用的空间
void help(void) // 功能: 显示帮助命令
void pathset()//设置文件路径
void cd(void) // 功能: 切换目录(cd .. 或者cd dir1)
void dir(void) // 功能: 显示当前目录下的子目录和文件(dir)
void mkdir(void) // 功能: 在当前目录下创建子目录(mkdir dir1)
void create(void) // 功能: 在当前目录下创建文件(creat file)
void open()// 功能: 打开当前目录下的文件(open file1)
void read()// 功能: 从文件中读出字符(read file1)
void write()// 功能: 向文件中写入字符(write file1)
void close(void) // 功能: 关闭已经打开的文件(close file1)
void del(int i) //回收i节点,有文件则删除文件
void delet(void) //删除子目录树和文件
void logout()// 功能: 退出当前用户(logout)
void quit()// 功能: 退出文件系统(quit)
void errcmd()// 功能: 显示错误
void free_user()//清空内存中存在的用户名