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

合集下载

模拟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文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。

首先,我们需要设计文件系统的存储结构。

文件系统可以在硬盘上以一个分区的形式存在,我们可以使用一个整数数组来表示硬盘,每个数组元素表示硬盘上的一个块。

我们还可以使用一个超级块来记录文件系统的信息,例如文件系统的状态、块的总数、块的使用情况等。

此外,我们还需要设计并实现一个索引节点表,用于保存文件或目录的元数据信息,例如文件的大小、权限、创建时间等。

接下来,我们需要实现文件和目录的管理功能。

文件和目录可以通过其在索引节点表中的索引来标识。

我们可以使用一个数组来表示目录,数组的每个元素都是一个目录项,记录了文件或子目录的名字和索引节点的索引。

我们还可以使用一个栈来保存当前目录的路径,方便用户在不同目录之间切换。

为了支持目录的嵌套,我们可以在目录项中添加一个指向父目录的索引。

在文件和目录的管理基础上,我们还需要实现文件的读写操作。

文件可以通过其索引节点的索引来标识。

当用户要读取文件时,我们需要根据文件的索引节点找到文件的块地址列表,然后将列表中的块读取到内存中。

当用户要写入文件时,我们需要找到文件的块地址列表中最后一个块,如果该块已满,则需要申请一个新的块,并将新块的地址添加到块地址列表中。

同时,我们还需要更新文件的大小和修改时间等元数据信息。

最后,我们还需要实现文件权限的管理功能。

文件的权限信息可以通过文件的索引节点来保存。

我们可以使用一个整数来表示文件的权限,例如八进制数,每一位代表一个权限,例如读取权限、写入权限和执行权限等。

当用户要访问文件时,我们需要根据用户的权限和文件的权限来判断用户是否具有相应的权限。

总结起来,要完成这个大作业,我们需要设计并实现一个模拟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文件系统模拟

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文件系统

[精华]模拟一个小型类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 [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。

浙江工业大学模拟UNIX系统实验

浙江工业大学模拟UNIX系统实验
2013-2014(1)操作系统原理课程大型实验报 告
模拟 Unix 文件系统
软件工程(2+2)2 班 201326740214 唐高望 201326740226 殷烨露 201326740220 项耀军
一、 实验要求
1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存 储
2.文件系统的目录结构采用类似 Linux 的树状结构; 3.要求模拟的操作包括:
if(i < InputName.length()){ //不再当前目录下创建;//截断路径 int LastF; for(LastF = (InputName.length() - 1);InputName[LastF] !=
F;LastF--); char Path[50]; Path[LastF] = '$'; for(int j = 0;j<LastF;j++){ Path[j] = InputName[j]; } _NowDirID = FindPath(_NowDirID,Path); if( _NowDirID == 0) return false;
//检测是否有重名 for(int CurID = fcb[dFilePid].sID ; CurID != -1 ; CurID = fcb[CurID].nID ){
if(fcb[CurID].F == 2 && fcb[CurID].Name == InputName){ cout<<"目的目录下有同名文件,操作失败...\n"; return false;
string RemName = ""; for(LastF++; LastF < InputName.length() ;LastF++){

模拟UNIX文件系统

模拟UNIX文件系统

《操作系统原理》课程设计任务书题目:模拟UNIX文件系统学生姓名:周燕薇学号:10730125班级:10计算机科学与技术题目类型:软件工程(R)指导教师:王连相一、设计目的学生通过该题目的设计过程,掌握UNIX文件系统的的原理、软件开发方法并提高解决实际问题的能力。

二、设计任务1、了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

2、编写程序实现文件系统的基本功能:多用户:usr1,usr2,usr3,……, usr8 (1-8个用户)、多级目录:可有多级子目录、具有login (用户登录)、系统初始化(建文件卷、提供登录模块)、文件的创建: create、文件的打开:open、文件的读:read、文件的写:write、文件关闭:close、删除文件:delete 、创建目录(建立子目录):mkdir、改变当前目录:cd、列出文件目录:dir、退出:logout。

三、设计要求1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。

2、设计合适的测试用例,对得到的运行结果要有分析。

3、设计中遇到的问题,设计的心得体会。

4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。

5、光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下,刻录成5寸光盘,并复制四份(共五张内容相同的光盘),放在一个专门的资料袋中,不必再装软盘。

四、提交的成果1. 设计任务书一本(学校统一格式)2. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 设计思想;3)各模块的伪码算法;4)函数的调用关系图;5)测试结果;6)设计总结;7) 参考文献、致谢等。

操作系统 模拟文件管理 大作业

操作系统 模拟文件管理 大作业

课程设计二:模拟文件管理一.设计目的(1)建立一个简单的模拟文件管理系统。

(2)理解用户界面和操作命令在操作系统中的作用。

二.设计要求需要实现一个命令行操作界面,包含如下命令:1.创建文件功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。

2.删除文件功能:删除指定的文件3.创建目录功能:在当前路径下创建指定的目录。

4.删除目录功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除操作将该目录下的全部文件和子目录都删除。

5.改变目录功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝对目录。

6.显示目录功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。

对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误情况,程序应该作出相应处理并给出错误信息。

界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致,可以自己设计更多的命令或者附加功能。

三.环境本实验是在windows xp+vc 6.0环境下实现的,利用windows SDK 提供的系统接口(API)完成程序功能。

在windows xp下安装好VC后进行,VC是一个集成开发环境,其中包含了windows SDK所有工具,所以就不用单独在安装SDK了,程序中所用的API是操作系统提供的用来进行应用程序设计的系统功能接口。

要使用这些API,需要包含对这些函数进行说明的SDK头文件,最常见的就是windows.h。

一些特殊的API调用还需要包含其他的头文件。

四.步骤1.打开VC,选择菜单项File->New,选择Project选项卡并建立一个名为filesys的win32 console application工程。

2.在工程中创建原文件filesys.cpp:选择菜单项Project->Add to Project->File,此时将打开一个新窗口,在其中输入想要创建的文件名字,这里是filesys.cpp,在其中编辑好原文件并保存。

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

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

模拟UNIX文件系统的设计及实现操作系统大作业(含源文件)案场各岗位服务流程销售大厅服务岗:1、销售大厅服务岗岗位职责:1)为来访客户提供全程的休息区域及饮品;2)保持销售区域台面整洁;3)及时补足销售大厅物资,如糖果或杂志等;4)收集客户意见、建议及现场问题点;2、销售大厅服务岗工作及服务流程阶段工作及服务流程班前阶段1)自检仪容仪表以饱满的精神面貌进入工作区域2)检查使用工具及销售大厅物资情况,异常情况及时登记并报告上级。

班中工作程序服务流程行为规范迎接指引递阅资料上饮品(糕点)添加茶水工作1)眼神关注客人,当客人距3米距离侯客迎询问客户送客户要求注意事项时,应主动跨出自己的位置迎宾,然后15度鞠躬微笑问候:“您好!欢迎光临!”2)在客人前方1-2米距离领位,指引请客人向休息区,在客人入座后问客人对座位是否满意:“您好!请问坐这儿可以吗?”得到同意后为客人拉椅入座“好的,请入座!”3)若客人无置业顾问陪同,可询问:请问您有专属的置业顾问吗?,为客人取阅项目资料,并礼貌的告知请客人稍等,置业顾问会很快过来介绍,同时请置业顾问关注该客人;4)问候的起始语应为“先生-小姐-女士早上好,这里是XX销售中心,这边请”5)问候时间段为8:30-11:30 早上好11:30-14:30 中午好 14:30-18:00下午好6)关注客人物品,如物品较多,则主动询问是否需要帮助(如拾到物品须两名人员在场方能打开,提示客人注意贵重物品);7)在满座位的情况下,须先向客人致歉,在请其到沙盘区进行观摩稍作等待;阶段工作及服务流程班中工作程序工作要求注意事项饮料(糕点服务)1)在所有饮料(糕点)服务中必须使用托盘;2)所有饮料服务均已“对不起,打扰一下,请问您需要什么饮品”为起始;3)服务方向:从客人的右面服务;4)当客人的饮料杯中只剩三分之一时,必须询问客人是否需要再添一杯,在二次服务中特别注意瓶口绝对不可以与客人使用的杯子接触;5)在客人再次需要饮料时必须更换杯子;下班程序1)检查使用的工具及销售案场物资情况,异常情况及时记录并报告上级领导;2)填写物资领用申请表并整理客户意见;3)参加班后总结会;4)积极配合销售人员的接待工作,如果下班时间已经到,必须待客人离开后下班;1.3.3.3吧台服务岗1.3.3.3.1吧台服务岗岗位职责1)为来访的客人提供全程的休息及饮品服务;2)保持吧台区域的整洁;3)饮品使用的器皿必须消毒;4)及时补充吧台物资;5)收集客户意见、建议及问题点;1.3.3.3.2吧台服务岗工作及流程阶段工作及服务流程班前阶段1)自检仪容仪表以饱满的精神面貌进入工作区域2)检查使用工具及销售大厅物资情况,异常情况及时登记并报告上级。

Unix操作系统实验报告

Unix操作系统实验报告

Unix操作系统实验报告计算机科学与技术学院实验一、Linux基本命令一.实验目的掌握linux平台下的基本命令(40个)二.实验说明在介绍所有的命令之前,先介绍一下Linux的在线帮助man。

在Linux下,当你要查找一个命令的用法的,你可以通过man 命令名来源得命令的详细说明。

因为每个Linux都有一份man文档,所以介绍命令的时候我们只是简直介绍一下命令的学用选项。

如果想查看命令的详细说明,请自己看man。

下面是man各小节的内容:1 用户命令。

2 系统调用。

3 库函数。

4 特殊文件(设备和网络接口)。

5 文件格式。

6 游戏和演示。

7 系统环境、表格和宏。

8 系统管理和相关命令。

三.命令说明1.apropos 依据所给关键字查找相关的命令和系统调用格式:apropos keyword例:查找与ftp相关的命令和系统调用$apropos ftp注:类似的命令有man -k。

man -k 其实就是执行apropos2.at 在某一特定时间执行指定的命令格式:at [-V][-q 队列][-f 文件][-m] time选项说明:-V显示标准的错误输出。

-f可将作业存在一个文件中,用这个选项指定文件。

例如一个shell文件。

-q指定队列名称,默认为c。

-m执行后给用户发邮件。

time 指定开始执行的时间。

时间格式为: HH:MM,日期格式:MM/DD/YY或MM.DD.YY或MMDDYY。

下面的例子演示了在2004年3月11日21点34分执行一个at命令。

$at 21:34 03/11/04执行这条命令后会得到一条warning:commands will be executed using (in order) a)$SHELL b) login shellc)/bin/sh。

然后就出现“at>”的提示符。

这时你就可以输入你要执行的命令了,结束后按Ctrl+d。

你就可以去喝茶了,到时间后系统会自动执行它。

操作系统-文件系统课程设计报告(附源码)

操作系统-文件系统课程设计报告(附源码)

操作系统课程设计题目文件系统学院计算机学院专业计算机科学与技术年级班别 10级7 班学号 3110006154 学生姓名指导教师刘老师20年月日文件系统一、课程设计的内容:模拟文件系统实现的基本功能,了解文件系统的基本结构和管理方法,加深理解文件系统的内部功能及内部实现。

通过用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

二、可行性分析:可行性分析是通过对项目的主要内容和配套条件,并通过对各方面进行调查研究和分析比较,并对项目建成以后所带来的影响,从而提出该项目是否值得投资和如何进行建设的咨询意见,是一种综合性的系统分析方法。

可行性分析应具有预见性、公正性、可靠性、科学性的特点。

这里以三个方面来分析此次设计:经济可行性、技术可行性、法律可行性。

1、经济可行性:编写该文件系统,只需要用到PC机和VC++6.0编程软件,不需要花费金钱,所以,在经济方面,这个课程设计适合做。

2、技术可行性:在做这个课程设计,事先需要掌握的知识有C/C++语言,数据结构,操作系统,PC机的基本操作和VC++6.0软件的使用方法等。

目前,这些知识都已经学习并掌握了,所以在技术方面,这个课程设计也适合做。

3、法律可行性:做这个课程设计,只是为了掌握文件系统的基本内容,提升自己的编程能力,没有违反法律法规,所以,在法律方面,这个课程设计也适合做。

三、需求分析1.设计一个多用户多级目录文件管理系统。

2.要设计多个实用命令并设置文件保护措施。

3.设计一个较实用的用户界面,方便用户使用,界面要为用户提供足够的选择信息,不需用户打入冗长的命令4. 功能简介:①多用户管理,多级目录形式。

②基本的文件操作功能,如新建文件、打开文件、写入文件、关闭文件、读取文件等。

③用户间文件的共享功能四、概要设计(逻辑图)1.系统结构图:2、界面简单说明该系统主要分为两个界面,用户操作界面及文件操作管理界面。

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

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

模拟UNIX文件系统的设计及实现操作系统大作业(含源文件)华南理工大学“计算机操作系统”课程设计大作业(含答案)一、题目: 模拟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)总结自己的设计体会;编程语言及操作系统平台不限。

模拟UNIX(linux)文件系统

模拟UNIX(linux)文件系统

操作系统课程设计学院:信息科学与工程学院专业:班级:学号:学生姓名:指导教师:2009 年 4 月18 日一、实验内容1、题目:模拟UNIX(linux)文件系统[问题描述]在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。

二、概要设计在现有机器硬盘上开辟20M的硬盘空间(利用一个循环操作,在Disk中写入20M 的零,创建一个20M的文件即是),作为设定的硬盘空间。

磁盘块物理模型如下文件则是指具有文件名的若干相关元素的集合。

文件属性主要如下文件名:实现了按名存取,文件名和目录文件允许重名。

文件类型:可以从不同的角度来规定文件的类型。

普通文件、管道文件、块文件。

文件长度:指文件的当前长度,长度的单位可以是KB。

文件的物理位置:文件在磁盘中物理的存储,并打印出来。

此次UNIX文件系统最简单的目录结构。

整个文件系统中只建立一张目录表,每个文件一个目录项,目录项含有文件相关信息。

每建立一个新文件要先检索所有的目录项保证文件名唯一。

然后找出一空白目录项填入相关信息,并修改状态位。

删除文件是找到对应目录项,回收所占用空间,清除该目录。

逻辑结构如下Unix文件系统当文件很多时,文件目录要占用大量的盘块。

在查找目录的过程中,可能需要多次启动磁盘读入目录文件的盘块。

在检索目录文件中只用到了文件名,显然,文件的物理地址等文件的描述信息在检索目录时不需调入内存。

为此,可以把文件名与文件描述信息分开。

使文件描述信息单独形成一个索引结点。

把文件描述信息单独形成一个称为索引结点的数据结构,简称为inode;文件目录中的每个目录项,则仅由文件名及指向该文件所对应的inode的指针所构成。

这样,为找到一个文件的平均启动磁盘的次数减少很多模型如下:存储空间的分配与回收成组链接法首先,建立操作系统课程的设计模型。

这个系统将利用一个20M的文件作为自己的磁盘空间,设计时由于一个盘块占用1KB,所以20M空间可以产生20480个盘块系统本身将0# - 30#块作为系统区,所以用户区便剩下20450个盘块,每50个盘块为一组,一共可以分为409个组。

操作系统----模拟UNIX文件系统的设计及实现

操作系统----模拟UNIX文件系统的设计及实现

/*TYPE UnixFileSysSim.cpp* 版权信息** 文件名称:UnixFileSysSim.cpp* 摘要:模拟实现UNIX的文件系统*****/#include "UnixFileSysSim.h"/** 函数介绍:寻找第一个空白的文件块ID* 输入参数:无* 输出参数:无* 返回值:返回第一个空白块的ID*/unsigned FindBlankFileBlockId(){unsigned char c;for (unsigned i = 0; i < FS.bm.BitMapLen / 8; i++){c = FS.bm.BMStart[i] | 0x7F;if (c == 0x7F){return i * 8; //一个字节左边第一位为0,表示该区域未使用}c = FS.bm.BMStart[i] | 0xBF;if (c == 0xBF){return i * 8 + 1;}c = FS.bm.BMStart[i] | 0xDF;if (c == 0xDF){return i * 8 + 2;}c = FS.bm.BMStart[i] | 0xEF;if (c == 0xEF){return i * 8 + 3;}c = FS.bm.BMStart[i] | 0xF7;if (c == 0xF7){return i * 8 + 4;}c = FS.bm.BMStart[i] | 0xFB;if (c == 0xFB){return i * 8 + 5;}c = FS.bm.BMStart[i] | 0xFD;if (c == 0xFD){return i * 8 + 6;}c = FS.bm.BMStart[i] | 0xFE;if (c == 0xFE){return i * 8 + 7;}}return FILEBLOCKCOU + 1;}/** 函数介绍:寻找第一个文件块地址* 输入参数:fileblockid 文件块ID* 输出参数:无* 返回值:返回文件块的地址*/char * FindBlankFileBlock(unsigned fileblockid) {FileBlock *fblock = FS.head;while (fblock->next != NULL){if (fblock->FileBlockId == fileblockid){return fblock->FileBlockAddr;}else{fblock = fblock->next;}}return NULL;}/** 函数介绍:得到当前时间的字符串* 输入参数:时间字符串的指针* 输出参数:无* 返回值:void*/void GetCurrentTime(char *currtime){char dbuffer [9];char tbuffer [9];_strdate(dbuffer);_strtime(tbuffer);strcpy(currtime, dbuffer);strcat(currtime, " ");strcat(currtime, tbuffer);}/** 函数介绍:更新文件索引* 输入参数:fileblockid 文件块ID* 输出参数:无* 返回值:无*/void AddFileIndex(unsigned fileblockid, unsigned filelevel, char *filename, char *parentname){FS.FI.FIStart[FS.FI.FICount].FileBlockId = fileblockid;FS.FI.FIStart[FS.FI.FICount].FileLevel = filelevel;strcpy(FS.FI.FIStart[FS.FI.FICount].FileName, filename);if (parentname == NULL){memset(FS.FI.FIStart[FS.FI.FICount].ParentName, '\0', MAXFILENAMELEN);}else{strcpy(FS.FI.FIStart[FS.FI.FICount].ParentName, parentname);}FS.FI.FIStart[FS.FI.FICount].Index = FS.FI.FICount;FS.FI.FIStart[FS.FI.FICount].effect = 1;FS.FI.FICount ++;}/** 函数介绍:更新位示图* 输入参数:fileblockid 文件块ID* 输出参数:无* 返回值:无*/void UpdateBitMap(unsigned fileblockid){//计复所在位示图的位置int dirInBitmap = ((int)(fileblockid / 8));int dirInChar = fileblockid % 8;char *c = &(FS.bm.BMStart[dirInBitmap]);char xor;switch (dirInChar){case 0:xor = 0x80;break;case 1:xor = 0x40;break;case 2:xor = 0x20;break;case 3:xor = 0x10;break;case 4:xor = 0x08;break;case 5:xor = 0x04;break;case 6:xor = 0x02;break;case 7:xor = 0x01;break;}*c = *c ^ xor;}/** 函数介绍:创建一个文件元素* 输入参数:acc 文件元素可操作权限,filename 文件元素名称,type 文件元素类型,filecontent 文件内容* 输出参数:无* 返回值:返回一个文件元素的指针*/FSElement * CreateFileElement(FEAccess acc, char *filename, FEType type, char *filecontent, FSElement *parent){//查找第一个空白文件块IDunsigned blankFileBlockId = FindBlankFileBlockId();if (blankFileBlockId >= FILEBLOCKCOU){printf("未找到一个文件块的id\n");return NULL;}//查找第一个空白块的地址char *blank = FindBlankFileBlock(blankFileBlockId);if (blank == NULL){printf("未找到一个文件块的地址\n");return NULL;}FSElement *fs = (FSElement *)blank;fs->Access = acc;fs->Creator = CS.CurrentUser;GetCurrentTime(fs->CreateTime);fs->FileBlockId = blankFileBlockId;fs->FileLevel = CS.FileLevel;strcpy(fs->FileName, filename);strcpy(fs->LastModTime, fs->CreateTime);fs->Type = type;fs->parent = parent;if (type == dir)fs->FileElemLen = sizeof(FSElement);fs->FileData = NULL;}else{fs->FileElemLen = (unsigned)strlen(filename);fs->fileStu = closed;fs->FileData = (char *)fs + sizeof(FSElement);if (filecontent == NULL){}else{strcpy(fs->FileData, filecontent);}}//更新索引if (parent == NULL){AddFileIndex(blankFileBlockId, CS.FileLevel, filename, NULL);}else{AddFileIndex(blankFileBlockId, CS.FileLevel, filename, parent->FileName);}//更新BITMAPUpdateBitMap(blankFileBlockId);return fs;}/** 函数介绍:创建文件块链表* 输入参数:datahead 第一块数据的地址,blockcap 一个文件块的大小,len 链表的长度* 输出参数:无* 返回值:返回链表的头指针*/FileBlock * CreateFileBlockList(char *datahead, unsigned blockcap, unsigned len) {if (datahead == NULL || len == 0){return NULL;FileBlock *head;FileBlock *pnew;FileBlock *pold;head = pold = pnew = (FileBlock *)malloc(sizeof(FileBlock));for ( unsigned i = 0; i < len; i++){pold->FileBlockId = i;pold->FileBlockCap = FILEBLOCKCAP;pold->FileBlockAddr = datahead + i * blockcap;memset(pold->FileBlockAddr, '\0', blockcap);if (i != len - 1){pnew = (FileBlock *)malloc(sizeof(FileBlock));}else{pnew = NULL;}pold->next = pnew;pold = pnew;}return head;}/** 函数介绍:初始化模拟文件系统* 输入参数:无* 输出参数:无* 返回值:true-初始化成功,false-初始化失败*/bool InitFileSys(){//初始化模拟的文件系统if ((FS.FSStart = (char *)malloc(FILESYSCAP)) == NULL){return false;}FS.FileSystemCap = FILESYSCAP;FS.bm.BitMapLen = BITMAPLEN;FS.bm.BMStart = FS.FSStart;//设置位示图为未使用memset(FS.bm.BMStart, '\0', FS.bm.BitMapLen);//初始化文件系统索引FS.FI.FIStart = (FileIndexElement *)(FS.FSStart + BITMAPLEN);//因为是模拟系统,暂定一个文件或文件夹最多占用一个文件块,一个文件块只放一个文件元素FS.FI.FILen = sizeof(FileIndexElement) * FILEBLOCKCOU + sizeof(unsigned) * 2;FS.FI.FICount = 0;memset(FS.FI.FIStart, '\0', FS.FI.FILen);//初始化文件块FS.FileBlockCou = FILEBLOCKCOU;FS.head = CreateFileBlockList((FS.FSStart + FILESYSCAP - FILEBLOCKCAP * FILEBLOCKCOU),FILEBLOCKCAP, FS.FileBlockCou);//区域的后FILEBLOCKCAP * FILEBLOCKCOU 个单元用来存储数据if (FS.head == NULL){return false;}//初始化系统当前状态erName = (char *)calloc(10,sizeof(char));strcpy(erName, "man");CS.CurrentUser.ut = admin;CS.CurrParent = NULL;CS.FileLevel = 0;CS.CurrentPath = (char *)calloc(1000, sizeof(char));//创建一个根目录base = CreateFileElement(pub, "root", dir, NULL, NULL);if (base == NULL){return false;}else{return true;}/** 函数介绍:系统登录模块* 输入参数:无* 输出参数:无* 返回值:true 登录成功,false 登录失败*/bool Login(){char username[10];char password[MAXPASSWORDLEN];int c;for (c = 0; c < USERTESTLOGINCOU; c++){int i = 0;memset(password, '\0', MAXPASSWORDLEN);memset(username, '\0', 10);printf("login:");gets(username);printf("password:");while (i < MAXPASSWORDLEN && (password[i++] = getch()) != 0x0d) {};password[strlen(password) - 1] = '\0';printf("\nuser name : %s \npassword:%s\n", username, password);if ((strcmp(username, "user1") == 0 && strcmp(password, "user1") == 0) || (strcmp(username, "user2") == 0 && strcmp(password, "user2") == 0) ||(strcmp(username, "user3") == 0 && strcmp(password, "user3") == 0) ||(strcmp(username, "user4") == 0 && strcmp(password, "user4") == 0) ||(strcmp(username, "user5") == 0 && strcmp(password, "user5") == 0) ||(strcmp(username, "user6") == 0 && strcmp(password, "user6") == 0) ||(strcmp(username, "user7") == 0 && strcmp(password, "user7") == 0) ||(strcmp(username, "user8") == 0 && strcmp(password, "user8") == 0) ||(strcmp(username, "super") == 0 && strcmp(password, "super") == 0)) {if (strcmp(username, "super") == 0) // 一个管理员{strcpy(erName, username);CS.CurrentUser.ut = admin;}else{//memset(erName, '\0', 10);strcpy(erName, username);CS.CurrentUser.ut = comm;}CS.FileLevel++;CS.CurrParent = base;strcpy(CS.CurrentPath, "\\");printf("\n欢迎使用模拟UNIX文件系统。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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文件,虚拟文件系统不存在,此时程序会提示你是否要建立文件系统,得到你的确认后程序将格式化虚拟磁盘建立虚拟文件系统,并在磁盘当前目录里生成这两个文件。

相关文档
最新文档