实验四 文件系统实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);