模拟UNIX文件系统的设计及其实现操作系统大作业(含源文件)
模拟unix文件系统代码

/* user.h */pragma once#include<string>class user{public:char userName[10]; //用户名int userID; //用户IDint priority; //用户权限char password[10]; //密码int group; //用户组user();~user();};/* user.cpp */#include"user.h"user::user(){strcpy(userName,"");userID=-1;priority=1;strcpy(password,"");}user::~user(){}/* memory.h */pragma onceclass memory{public:char data[64];memory();~memory();};/* memory.cpp */#include"memory.h"memory::memory(){for(int i=0; i<64; i++)data[i]='\0';}memory::~memory(){}/* iNode.h */#pragma once#include<time.h>class iNode{public:int fileStyle; //文件类型0为目录文件,为正规文件int fileMod; //文件权限0为可读,为可写,为可读写,3为可读可执行,为可写可执行,为可读写可执行int fileAddress[13]; //文件存储的物理块int fileLength; //文件长度int fileAssociated; //关联文件数time_t modifyTime; //文件修改时间char fileOwner[10]; //文件拥有者int fileGroup; //文件所属组iNode();~iNode();};/* iNode.cpp */#include"iNode.h"#include<string>iNode::iNode(){fileStyle=-1; //-普通文件0;d目录文件1;b块设备文件2;c字符设备文件3;|链接文件fileMod=-1;for(int i=0; i<13; i++)fileAddress[i]=-1;fileLength=0;fileAssociated=0;time (&modifyTime);strcpy(fileOwner,"");fileGroup=0;;}iNode::~iNode(){}/* directory.h */#pragma onceclass directory{public:char fileName[256]; //文件名int directoryID; //文件i节点号int parentID; //文件父节点号directory();~directory();};/* directory.cpp */#include"directory.h"#include<string>directory::directory(){strcpy(fileName,"");directoryID=-1;parentID=-1;}directory::~directory(){}/*superBlock.h */#pragma onceclass superBlock{public:int bitMap[512]; //位示图,空闲,占用int freeBitNum; //空闲盘块数int freeINode[256]; //空闲节点superBlock();~superBlock();};/*superBlock.cpp */#include"superBlock.h"superBlock::superBlock(){int i;for( i=0; i<512; i++)bitMap[i]=0; //0时空闲,时占用for( i=0; i<256; i++)freeINode[i]=0; //0时空闲,时占用freeBitNum=512;}superBlock::~superBlock(){}/ fileOS.cpp : 定义控制台应用程序的入口点。
操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。
文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。
本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。
我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。
以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。
文件系统由文件和目录组成,可以通过树状结构来表示。
我们可以使用一个数据结构来模拟文件系统的存储和管理。
2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。
这包括创建根目录和设置当前目录为根目录。
3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。
我们可以通过命令来创建和删除文件和目录。
例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。
4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。
我们可以使用"chmod"命令来修改文件或目录的权限。
权限通常包括读、写和执行权限。
5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。
6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。
此外,我们还可以使用"find"命令来查找文件或目录。
7. 文件和目录的读写操作文件可以被读取和写入。
操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验操作系统文件管理系统模拟实验一、实验目的本实验旨在通过模拟操作系统的文件管理系统,加深对操作系统文件管理的理解,锻炼操作系统的应用能力。
二、实验环境1、操作系统:Windows/Linux/MacOS2、编程语言:C/C++/Java/Python等三、实验内容1、初始化文件管理系统1.1 创建根目录,并初始化空文件目录1.2 初始化用户目录和权限设置2、文件操作2.1 创建文件2.1.1 检查文件名合法性2.1.2 检查文件是否已存在2.1.3 为新文件分配磁盘空间2.1.4 添加文件元数据信息2.2 打开文件2.2.1 检查文件是否存在2.2.2 检查用户权限2.3 读取文件内容2.3.1 读取文件权限检查2.3.2 读取文件内容2.4 写入文件内容2.4.1 写入文件权限检查2.4.2 写入文件内容2.5 删除文件2.5.1 检查文件是否存在2.5.2 检查用户权限2.5.3 释放文件占用的磁盘空间2.5.4 删除文件元数据信息3、目录操作3.1 创建子目录3.1.1 检查目录名合法性3.1.2 检查目录是否已存在3.1.3 添加目录元数据信息3.2 打开目录3.2.1 检查目录是否存在3.2.2 检查用户权限3.3 列出目录内容3.3.1 列出目录权限检查3.3.2 列出目录内容3.4 删除目录3.4.1 检查目录是否存在3.4.2 检查用户权限3.4.3 递归删除目录下所有文件和子目录3.4.4 删除目录元数据信息四、实验步骤1、根据实验环境的要求配置操作系统和编程语言环境。
2、初始化文件管理系统,创建根目录,并初始化用户目录和权限设置。
3、进行文件操作和目录操作。
五、实验结果分析根据实验步骤进行文件操作和目录操作,观察系统的运行情况并记录相关实验结果。
六、实验结论通过本实验,深入了解了操作系统中文件管理系统的相关原理和实现方式,并且通过实验操作进一步巩固了相应的应用能力。
模拟UNIX文件系统的设计及实现操作系统大作业

模拟UNIX文件系统的设计及实现操作系统大作业UNIX文件系统是一种常见的操作系统文件系统,它提供了一种以层次结构组织文件和目录的方式来管理存储设备上的数据。
为了完成这个大作业,我们需要设计并实现一个简化版的UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
首先,我们需要设计文件系统的存储结构。
文件系统可以在硬盘上以一个分区的形式存在,我们可以使用一个整数数组来表示硬盘,每个数组元素表示硬盘上的一个块。
我们还可以使用一个超级块来记录文件系统的信息,例如文件系统的状态、块的总数、块的使用情况等。
此外,我们还需要设计并实现一个索引节点表,用于保存文件或目录的元数据信息,例如文件的大小、权限、创建时间等。
接下来,我们需要实现文件和目录的管理功能。
文件和目录可以通过其在索引节点表中的索引来标识。
我们可以使用一个数组来表示目录,数组的每个元素都是一个目录项,记录了文件或子目录的名字和索引节点的索引。
我们还可以使用一个栈来保存当前目录的路径,方便用户在不同目录之间切换。
为了支持目录的嵌套,我们可以在目录项中添加一个指向父目录的索引。
在文件和目录的管理基础上,我们还需要实现文件的读写操作。
文件可以通过其索引节点的索引来标识。
当用户要读取文件时,我们需要根据文件的索引节点找到文件的块地址列表,然后将列表中的块读取到内存中。
当用户要写入文件时,我们需要找到文件的块地址列表中最后一个块,如果该块已满,则需要申请一个新的块,并将新块的地址添加到块地址列表中。
同时,我们还需要更新文件的大小和修改时间等元数据信息。
最后,我们还需要实现文件权限的管理功能。
文件的权限信息可以通过文件的索引节点来保存。
我们可以使用一个整数来表示文件的权限,例如八进制数,每一位代表一个权限,例如读取权限、写入权限和执行权限等。
当用户要访问文件时,我们需要根据用户的权限和文件的权限来判断用户是否具有相应的权限。
总结起来,要完成这个大作业,我们需要设计并实现一个模拟UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
操作系统课程设计-文件系统的模拟设计

操作系统课程设计报告题目:文件系统的模拟设计一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容(1)概述为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护(2)设计原理和系统总体功能框架图1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、对文件或目录的操作采用windows系统的API函数来实现。
6、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。
功能结构图如图1.0所示:(3)详细设计及少数重要编码的说明这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。
①、显示列表函数和目录流程图如图1.1所示②、文件创建函数算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
Unix文件系统模拟

操作系统课程设计说明书题目: 一个多用户多级目录结构文件系统设计与实现账户:user208密码:dryish20一、目的通过操作系统内其中一个子系统的设计和实现,掌握操作系统设计的方法与技巧,增强系统软件设计的实际工作能力。
二、内容设计并实现一个多用户多级目录结构的文件系统。
该系统必须具备下列功能: login 用户登录logout 用户退出init 文件系统初始化目录操作md 创建目录rd 删除目录cd 设置目录文件操作create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件dir 列文件目录三、设计思想说明1 设计环境课程设计的环境是Linux操作系统。
设计时可利用Linux 提供的文件管理的功能调用,建立一个模拟的文件系统。
基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux系统的功能调用,l 编写各程序模块。
2、文件卷的组织以1M的内存空间作为文件空间,空间“分块”,编号为0#~(BLKMAX-1)# 。
“分块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。
分块主要体现在文件卷的读/写模块上。
# define BSIZE 512 /* 512bytes/块*/# define BLKMAX 2048 /* 共2048块*/0#块的作用: 0# 块是专用块(超级块)。
前半部用于存放文件卷空间的位示图( bitmap),位状态='0'表示对应块空闲,状态='1'表示已分配。
后半部的最后32 个字节用于存放根目录的目录结构。
0#块不参与文件空间的动态分配。
1#~(BLKMAX-1)#块用于存放文件(普通文件和子目录文件)的信息。
四、数据结构的设计(1) 文件目录结构struct dir{ unsigned short d-mode; /* 文件属性及访问权限*/char d-uid; /* 文件主标识*/char d-gid; /* 文件主同组用户标识*/int d-fsize; /* 文件大小(字节) */char d-name[8]; /* 文件名*/int d-add[10]; /* 存放文件信息的空间地址(块号) */}# define DSIZE 32 /* 以上目录结构占用32字节*/按以上述定义,每一块可存放16个目录结构。
[精华]模拟一个小型类UNIX文件系统
![[精华]模拟一个小型类UNIX文件系统](https://img.taocdn.com/s3/m/e0cd70d2f71fb7360b4c2e3f5727a5e9856a2760.png)
[精华]模拟一个小型类UNIX文件系统题目一:模拟一个小型类UNIX文件系统一( 设计思想说明小型类UNIX文件系统是模拟UNIX中的文件系统,实现文件系统中一些基本的功能,即关于目录及文件的相关操作。
首先为这个文件系统申请1M的内存空间存放文件系统的空间结构。
编写的这个程序并不是通过读取文件获取信息的,故在程序结束之后先前修改过的数据并不保存。
空间结构包括引导块,专用块,i节点区,文件存储区,进程对换区。
由于课程设计的要求,对引导块和进程对换区不做要求,故在实现这个系统的过程中并没有对引导块和进程对换区进行设计。
专用块用来存放空闲块和i节点的资源管理表;i节点区用来存放i节点,包括文件的文件名,属性,占用内存大小,物理地址等信息;文件存储区用来存放文件的具体内容。
对于文件的打开,读,写,关闭等操作,程序设计了用户打开文件表和系统打开文件表以及内存活动i节点,为了更好地管理文件而设计的这两个表。
用户打开文件表使用一个结构体表示,它的指针指向对应的系统打开表的各项。
系统打开文件表同样使用一个结构体表示,它的指针指向内存活动i节点,共享计数等,简化以后留下内存活动i节点。
内存活动i节点是真正指向文件的具体内容,从而可以实现对文件的修改。
除了对文件进行的相关操作外,这个模拟系统还对目录进行了相关操作,系统使用树型目录结构,,故使用一个结构体表示,有目录的名字,父节点,子节点的主码,以及一些基本信息。
磁盘i节点的结构使指针指向文件的具体内容。
二( 相关数据结构的说明1. 描述用户的数据结构struct User //定义了一个用户,另外一个空间为新注册的用户使用{char username[15]; //用户名char passwd[15]; //用户密码 };struct User user[2];2. 描述目录的数据结构struct catalogue //存储目录的结构体 {char cataname[15]; //目录名int fathernum; //该目录的父节点int maxnum; //该目录最多可以拥有的子节点的个数int next[N]; //分别指向子节点 };struct catalogue Catalogue[M];3. 描述文件目录索引项的数据结构struct direntry //文件的目录索引项 {char filename[20]; //文件名struct direntry *before,*after; //它的前向指针和后向指针struct inode *filepointer; //指向i节点的指针char mode; //该文件所处的状态 };struct direntry *d_head;struct direntry *d_curr;描述i节点的数据结构 4.struct inode //i节点定义 {前向指针和后向指针 struct inode *before,*after; //int blocknum[5]; //存放文件的物理地址,该文件最大为5KBint uid; //创建该文件的用户主码int catnum; //文件所处目录的编码int sizenum; //文件所占内存块的大小int location; //文件所处位置 };struct inode *i_head;struct inode *i_curr;5. 描述系统打开表的数据结构struct listos //系统打开表 {struct direntry *list_os; //指向文件的目录项struct listos *after,*before; //前向指针和后向指针 };struct listos *lo_head;struct listos *lo_curr;6. 描述用户打开表的数据结构struct listfile //文件打开表 {struct listfile *before,*after; //前向指针和后向指针struct listos *list_file; //指向系统打开表项 };struct listfile *lf_head;struct listfile *lf_curr;7. 描述内存活动i节点的数据结构 struct memory //内存活动i节点 { struct inode *mem; //指向文件目录项struct memory *after; //后向指针 };struct memory *memhead;关于一些全局变量的定义 8.#define N 10 //每个目录最多拥有N个子目录#define M 30 //最多可拥有M个目录int I; //记录当前目录指针的位置int Inum; //记录当前已经拥有的目录数目int ID=0; //用户编号char choose[15]; //暂时存放操作指令int bitmap[1024]; //存放位示图char content[10000]; //暂时存放即将要写入文件的内容int FREENUM; //存放位示图为0的块号的开始char INODE[1024][1024]; //1M空间存放内容三( 各模块的算法流程图说明1. 用户登录模块的算法流程图开始登录L/l 其它选择L/R进入到操作模块输入用户名新密码和确认密码是否新密码和确认密码相等2. 操作模块的算法流程图开始cd open read write delete close logout mkdir dir 更打读写删关退创列改开文文除闭出建出件件当文文文系子目件件件统前目录目录下录的文件3. 更改当前目录的算法流程图开始cd输入想找的目录是否在目录链表中更改当前返回到操目录,修改作模块去全局变量4. 创建子目录的算法流程图开始mkdir输入想创建的目录名否是在目录链表中有重名更改当前目录,返回到操作模块去修改全局变量,将新的目录建立在原来的目录下的5. 列出目录中文件的相关信息的算法流程图开始dir输入想找的目录是否在目录链表中显示目录下的文返回到操件的信息,修改作模块去目录的全局变量6. 创建文件的算法流程图开始create输入要创建的文件名否是在文件目录索引链表中将新的文件存放在返回到操作模块去文件目录索引表中,并设置相关信息7. 打开文件的算法流程图开始open输入要打开的文件名在系统打开文是否件链表中&&当前用户创立该文件已经打是在文件目录开,不必再次索引表中打开将该文件插入否到系统打开文件表中想要操作的文件不存在8. 写文件的算法流程图开始write输入要进行写操作的文件名在系统打开文是否件链表中&&当前用户创立对该文件进行写操命令无效,作,并设置相关信息返回到操作模块去9. 读文件的算法流程图开始read输入要进行读操作的文件名在系统打开文是否件链表中&&当前用户创立对该文件的内容输命令无效,出以方便用户进行返回到操阅览作模块去10. 关闭文件的算法流程图开始close输入要关闭的文件名在系统打开文是否件链表中&&当前用户创立将文件的节点从系命令无效,统打开文件表中删返回到操除作模块去11. 删除文件的算法流程图开始delete输入要进行删除操作的文件名不在系统打开是否文件链表中&&当前用户创立命令无效,在文件目录返回到操索引链表中作模块去否该文件并不是存在,命令删除关于该节点的目无效录索引节点和i节点等相关信息四( 程序清单详见程序五( 使用说明书在运行程序之后,进入到模拟UNIX系统中,首先出现的提示是:用户登录还是要注册:L/l表示用户要登录,初始化的用户名:user1,密码:123;R/r表示要进行注册,在注册时要注意,输入的新密码和确认密码必须一致,否则程序将不进行这样的注册,在注册之后,程序自动为该用户登录。
模拟文件系统

操作系统课程设计-模拟文件系统班级:计044班姓名:夏鑫学号:2004121228一.实验目的用高级语言编写和调试一个简单的文件系统。
模拟文件管理的工作过程。
加深理解文件系统的内部功能和内部实现。
二.基本要求在任意一个OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。
可以实现下列几条命令FORMAT 初始化MKF 创建文件(给出文件名,文件长度)MKD 创建目录CD 改变当前目录(CD .. 返回根目录)DELF 删除文件DELD 删除目录DIR 显示文件目录(当前目录下)HELP 获得命令的帮助EXIT 退出系统三.设计思想说明1.设计环境课程设计的环境是windows xp sp2操作系统。
在windows系统中创建一个较大容量的文件,作为所设计文件系统的假想的“文件卷”,从而编写各程序模块。
2.开发环境课程设计所使用的开发环境是VC++ 6.03.基本思想以 1M 的存储器空间为例作为文件空间,空间“分块”。
超级块,在最前面,共占3.2k个字节。
其中0.2K个字节存放目录节点的位示图,1K个字节存放文件节点的位示图,2k字节存放盘块节点的位示图。
用位状态='0'表示空闲,状态='1'表示已分配。
后半部用于存放目录接点和文件接点。
超级块不参与文件空间的动态分配。
其他块用于存贮目录接点和文件接点的信息。
该程序在系统盘内自动创建一个目录A :作为该系统的根目录。
四.需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:CD 〈目录名〉,工作目录转到指定的目录下。
CD .. ,返回上一级目录下2.创建文件:MKF 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:DELF 〈文件名〉,删除指定的文件。
4.显示目录:DIR [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华南理工大学“计算机操作系统”课程设计大作业(含答案)一、题目: 模拟UNIX文件系统的设计及实现多用户、多目录的文件系统的设计------用VC或Delphi编程模拟文件系统的管理二、目的通过OS文件子系统的设计、增强OS设计的技巧,达到提高解决实际OS的设计能力的提高。
三、内容多用户的多级目录的文件系统设计。
四、功能要求1. 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户)2. 多级目录:可有多级子目录;3. 具有login (用户登录)4. 系统初始化(分配内存空间,创建文件卷,初始化根目录)5. 文件的创建:create6. 文件的打开:open7. 文件的读:read8.文件的写:write9. 文件关闭:close10. 删除文件:delete11. 创建目录(建立子目录):mkdir12. 改变当前目录:cd13. 列出文件目录:dir(包括文件属性)14. 删除目录:rmdir15. 退出:logout五、实现方法该大作业是实现一个类似unix的文件系统,只需要实现上述功能要求中所列出的功能,代码中不能调用OS系统提供的与文件操作和磁盘操作有关的系统调用。
设计提示:用内存模拟磁盘操作,对文件和目录的创建、删除、读写都用对内存的操作来模拟。
文件的属性信息用内存数据结构保存;所有文件内容和目录信息保存在内存中。
文件属性包括:文件名,所有者,创建时间,最后访问时间,文件大小,数据区指针或I-node指针等。
当程序运行结束时回收内存,信息不需要保存到磁盘,下次重新运行程序时重头开始。
六、实验要求每人完成一份大作业实验报告。
报告分设计思想、数据定义、处理流程、源程序、运行结果截图、设计体会等部分。
1)给出数据定义和详细说明;2)给出实现思想和设计流程;3)调试完成源程序;4)屏幕观察运行结果;5)总结自己的设计体会;编程语言及操作系统平台不限。
七、提交内容本大作业每个人必须单独完成。
最后需提交的内容包括:源程序(关键代码需要注释说明)、可运行程序、算法思路及流程图、心得体会。
大作业必须以WORD附件的形式提交。
大作业严禁抄袭。
发现抄袭一律以不及格论。
大作业内容要完整,一定要有算法思路、流程图、心得体会、运行输出信息截屏等内容,如果只提交源代码则大作业成绩记为不合格。
2017-3-20目录1.摘要 (2)2.问题描述 (2)3.设计目的 (2)4. 设计要求 (2)5. 详细设计 (3)5.1界面设计 (3)5.1算法设计. (3)6. 设计总结 (4)7. 参考文献 (4)8. 致谢 (5)9.附录 (36)模拟UNIX文件系统的设计及实现1.课程设计内容多用户的多级目录的文件系统设计。
2.概述UNIX采用树型目录结构,每个目录表称为一个目录文件。
一个目录文件是由目录项组成的。
每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。
在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。
所以,文件目录项记录了文件内、外部标识的对照关系。
根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。
UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。
UNIX中的文件系统磁盘存储区分配图如下:i节点区文件存储区本次课程设计是要实现一个简单的模拟UNIX文件系统。
我们在内存中开辟一个虚拟磁盘空间(1MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。
文件存储空间的管理可采用位示图方法。
3.课程设计任务及要求3.1.设计任务多用户、多级目录结构文件系统的设计与实现。
可以实现下列几条命令login 用户登录logout 退出当前用户dir 列文件目录creat 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件mkdir 创建目录ch 改变文件目录rd 删除目录树format 格式化文件系统quit 退出文件系统3.2.设计要求1) 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户) 2) 多级目录:可有多级子目录;3) 具有login (用户登录)4) 系统初始化(建文件卷、提供登录模块)5) 文件的创建:create (用命令行来实现)6) 文件的打开:open7) 文件的读:read8) 文件的写:write9) 文件关闭:close10) 删除文件:delete11) 创建目录(建立子目录):mkdir12) 改变当前目录:cd13) 列出文件目录:dir14) 退出:logout新增加的功能:15) 删除目录树:rd16) 格式化文件系统:format4.算法及数据结构4.1.算法的总体思想本课程设计是要求我们模拟UNIX文件系统功能设计一个虚拟文件系统,依据UNIX 文件系统的特点,其设计思想是:申请1M的内存空间来虚拟文件系统,将其以512B每块划分2048块,采用位示图管理文件系统的方法,利用其原理将第1块作为位图区(512B),共有对i节点区和数据块区分别建立位图;每个i节点占16B,每块有512/16=32个i节点,用2、3共两块作为i节点,总共有64个i节点,在位图区占用8B;其余2045块作为数据区(本课设要求只用到512块),在位图区占用接近256B(2045位)。
文件系统存储区分配图如下:位图:用0表示未使用,1表示使用;i节点:文件控制块(FCB),描述文件信息的一个数据结构;数据区:存放用户数据,包括目录文件。
位示图用以反映整个存储空间的分配情况,由若干字节构成,每个字节中的每一位对应文件存储器中的一块,“1”状态表示相应块已占用,“0”状态表示该块为空闲。
存储块分配时,只要把找到的空闲块所对应的位由"0" 改为"1",而在释放时,只要把被释放的物理块所对应的位由"1" 改为" 0 " 即可。
分配和释放都可以在内存的位示图上完成,而且速度较快。
磁盘i 节点利用在内存中生成链表或者数组的方法来生成,并且限制磁盘节点数的最大值。
同样内存i 节点利用链表的方法在内存中生成。
同时在往文件中写或者读的时候我们都是对内存中有内容进行读写。
在该文件系统中,规定一个文件最多只能占用2个数据块,这两个数据块可以是不连续的,其块号记录在一个索引块中,该索引块称为inode结构。
读入一个文件时,先根据目录找到相应的i节点号,将i节点读入主存i节点,建立打开文件表指向该主存i节点,再将文件内容读入主存数据区。
4.2.系统总体框架图4.3.系统总体流程图4.4.各模块功能说明4.4.1format模块功能:格式化文件系统,即初始化文件系统,相当于硬盘的格式化。
将其中原有的用户及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。
4.4.2 get_blknum和release_blk模块功能:实现i节点的分配和回收;算法:当一个新的文件被建立时,在给该文件分配磁盘存储区之前,应为该文件分配存放该文件的说明信息的磁盘i节点。
反之,当从文件系统中删除某个文件时,则要首先删除它的i节点项。
4.4.3init()模块功能:进入文件系统算法:初始化用户打开文件系表。
在内存中申请一个虚拟存储空间,此空间必须大于或等于可格式化时的空间。
将文件系统文件读入虚拟磁盘。
4.4.4 quit()模块功能:退出文件系统函数quit()算法:将虚拟磁盘内容保存到磁盘上。
释放虚拟磁盘所占据的空间。
撤消用用户打开文件表。
4.4.5 Creat()模块功能:创建文件用法:creat filename算法:分配一空目录项,分配磁盘块。
可用位示图。
填写该空目录项。
如文件长度(0),文件名,类型等。
分配一个用户打开文件表项,并填写相关目录,读写指针=0。
4.4.6 open()模块功能:打开文件open()用法:open filename算法:if(该文件已打开or该文件不存在)报错(出错信息)。
分配一个用户打开文件表项。
4.4.7 close()模块功能:关闭文件close()用法:close filename算法:释放该文件的用户占据的内存空间。
清空该文件的用户打开文件表目。
4.4.8 write()模块功能:写文件write(fd,buf,len)用法:write filename,需要先打开文件。
算法:指定写入内容长度。
buf。
修改打开文件表读/写指针。
修改目录项中的文件长度。
4.4.9 read()模块功能:read(fd,buf,len)用法:read filename,需先打开文件。
算法:文件信息.修改读/写指针。
4.4.10 delete()模块功能:删除文件delete()用法:delete filename算法:若文件不存在,报错。
回收磁盘空间。
回收目录项。
4.5.该文件系统的数据结构和申明函数// 用户(20B)typedef struct{char user_name[10]; // 用户名char password[10]; // 密码} User;// i节点(32B)typedef struct{short inum; // 文件i节点号char f ile_name[10]; // 文件名char t ype; // 文件类型char user_name[10]; // 文件所有者short iparent; // 父目录的i节点号short length; // 文件长度short address[2]; // 存放文件的地址} Inode;// 打开文件表(16B)typedef struct{short inum; // i节点号char file_name[10]; // 文件名short mode; // 读写模式(1:read, 2:write, 3:read and write) short offset; // 偏移量} File_table;// 申明函数void login(void); 用户登录,如果是新用户则创建用户void init(void); 程序初始化,将所有i节点读入内存int analyse(char *); 输入参数分析,分析用户命令void save_inode(int); 将num号i节点保存到虚拟磁盘文件hd.dat int get_blknum(void); 申请一个数据块void read_blk(int); 将i节点号为num的文件读入tempvoid write_blk(int); 将temp的内容写入hd.dat的数据区void release_blk(int); 释放文件块号为num的文件占用的空间void pathset(); 打印当前路径void deltree(int innum); 实现删除目录树函数int check(int); 检查用户权限// 用户命令处理函数void help(void); 命令提示帮助函数void cd(void); 改变当前目录void dir(void); 显示当前目录下所有文件和目录void mkdir(void); 创建目录void rd(void); 删除目录void creat(void); 创建文件void open(void); 打开void read(void); 读文件void write(void); 写文件void close(void); 关闭文件void del(void); 删除文件void logout(void); 用户注销void command(void); 命令管理函数void format(void); 格式化虚拟磁盘5.程序设计与实现5.1.主要函数列表5.2.函数之间的关系5.3. 程序流程图各功能模块流程图用户登陆login()初始化函数init()改变当前目录cd()创建目录mkdir()显示目录dir()创建文件creat()打开文件open() 读文件read()写文件write() 关闭文件close()分配磁盘块get_blk() 释放磁盘块release_blk(int)5.4. 源程序 /*main.c*/#include "head.h" char choice; int argc;// 用户命令的参数个数 char *argv[5];// 用户命令的参数 int inum_cur; // 当前目录 char temp[2*BLKSIZE]; // 缓冲区 Useruser;// 当前的用户char bitmap[BLKNUM]; // 位图数组Inode inode_array[INODENUM]; // i 节点数组File_table file_array[FILENUM]; // 打开文件表数组char i mage_name[10] = "hd.dat"; // 文件系统名称 FILE*fp;// 打开文件指针//创建映像hd ,并将所有用户和文件清除 void format(void){FILE *fp; int i; Inode inode;printf("Will be to format filesystem...\n"); printf("WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!\n"); printf("Proceed with Format(Y/N)?"); scanf("%c", &choice); gets(temp);if((choice == 'y') || (choice == 'Y')) {if((fp=fopen(image_name, "w+b")) == NULL){printf("Can't createfile%s\n",image_name);exit(-1); }for(i = 0; i < BLKSIZE; i++)fputc('0', fp);写磁盘块write_blk(int)读磁盘块read_blk(int)6.使用说明1.本程序首次运行(假设当前硬盘目录下还未建立user.txt和hd.dat文件)时会提示找不到user.txt文件,虚拟文件系统不存在,此时程序会提示你是否要建立文件系统,得到你的确认后程序将格式化虚拟磁盘建立虚拟文件系统,并在磁盘当前目录里生成这两个文件。