实验四 文件系统实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四文件系统实验

实验目的

1)掌握文件系统的工作机理。

2)理解文件系统的主要数据结构。

3)学习较为复杂的LINUX下的编程

实验内容

1)设计并实现一个一级(单用户)文件系统程序

a.提供以下操作:

➢文件创建/删除接口命令create/delete

➢目录创建/删除接口命令mkdir/rmdir

➢显示目录内容命令ls

b.创建的文件不要求格式和内容

2)设计并实现一个二级文件系统程序

a.提供用户登录;

b.文件、目录要有权限

实验结果及其解释说明

基本上实现了简单文件系统的实现。

创建并读写文件如下图所示:

打开文件、关闭文件、创建并显示子目录、删除子目录如下图所示:

实验中的问题及解决

首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都应以文件的形式存放于磁盘,这样便于查找和修改。

由于对文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化的方法。在写程序的开始也没有做详细的规划,因此在程序的结构上有些混乱。在后期做了一些调整,但是整体还是有缺陷的。另外程序只是很简单的实现了文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,

难免会出现一些Bug。必须对写好的程序进行反复的调试和优化。

实验体会

通过学习基本掌握了文件系统的存储结构,当遇到困难的时候,认真思考和查阅资料可以有很大的帮助。经过这次实验,锻炼了自己的动手的能力和分析问题的能力。在构造函数的时候可以开阔思维,同时加深自己对文件系统实现的理解。在进行理论知识的学习时,我们一定要注意动手应用,这样可以让我们更好地掌握理论知识。

程序清单

#include

#include

#include

#define DIR_LENGTH 1024 /*路径最长可达100字节*/

#define MAX_WRITE 1024*128 /*写入文字可达128k字节*/

#define MEM_D_SIZE 1024*1024 /*1M磁盘空间*/

#define DISKSIZE 1024 /*磁盘快的大小1K*/

#define MSD 5 /*最大子目录数5 (类似五叉树)*/

#define DISK_NUM MEM_D_SIZE/DISKSIZE /*磁盘快数目1024=1M/1K*/

#define FATSIZE DISK_NUM*sizeof(struct fatitem) /*FAT表大小8K=8192B (理想应该是1.5K)*/

#define MOFN 5 /*最大文件打开数5 (即除根以外最大深度为5)*/

#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /*根目录起始盘快号9*/

#define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小196*/

/*---------------FAT表项结构-----------------------*/

struct fatitem /* size 8*/

{

int item; /*存放文件下一个磁盘的指针*/

char em_disk; /*磁盘块是否空闲标志位0 空闲*/

};

/*-------------------目录项结构------------------------*/

struct direct /* size 196*/

{

/*-----文件控制快信息-----*/

struct FCB

{

char name[9]; /*文件/目录名8位*/

char property; /*属性1位目录0位普通文件*/

int size; /*文件/目录字节数(原注释位盘块数)*/

int firstdisk; /*文件/目录起始盘块号*/

int next; /*子目录起始盘块号*/

int sign; /*1是根目录0不是根目录*/

}directitem[MSD+2];

};

/*------------------文件打开表项结构--------------------------*/ struct opentable /* size 104*/

{

struct openttableitem /* size 20*/

{

char name[9]; /*文件名*/

int firstdisk; /*起始盘块号*/

int size; /*文件的大小*/

}openitem[MOFN];

int cur_size; /*当前打文件的数目*/

};

/*-------------------------------------------------------------------*/ struct fatitem *fat; /*FAT表*/

struct direct *root; /*根目录*/

struct direct *cur_dir; /*当前目录*/

struct opentable u_opentable; /*文件打开表*/

int fd=-1; /*文件打开表的序号*/

char *bufferdir; /*记录当前路径的名称*/

char *fdisk; /*虚拟磁盘起始地址*/

void initfile();

void format();

void enter();

void halt();

int create(char *name);

int open(char *name);

int close(char *name);

相关文档
最新文档