操作系统文件管理系统模拟实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件管理系统模拟
1.实验目的
通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2.实验内容
为Linux系统设计一个简单的二级文件系统。要求做到以下几点:
(1)可以实现下列几条命令(至少4条)
login 用户登录
dir 列文件目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
3.实验提示
(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
4.源代码
#include
#include
#include
#define MEM_D_SIZE 1024*1024 //总磁盘空间为1M
#define DISKSIZE 1024 //磁盘块的大小1K
#define DISK_NUM 1024
//磁盘块数目1K
#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1
//根目录起始盘块号
#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小
#define DIR_MAXSIZE 1024
//路径最大长度为1KB
#define MSD 5
//最大子目录数5#define MOFN 5
//最大文件深度为5
#define MAX_WRITE 1024*128
//最大写入文字长度128KB struct fatitem /* size 8*/
{
int item; /*存放文件下一个磁盘的指针*/
char em_disk; /*磁盘块是否空闲标志位0 空闲*/
};
struct direct
{
/*-----文件控制快信息-----*/
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
{
struct openttableitem
{
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);
int write(int fd,char *buf,int len);
int read(int fd,char *buf);
int del(char *name);
int mkdir(char *name);
int rmdir(char *name);
void dir();
int cd(char *name);
void print();
void show();
void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请1M空间*/
format();
}
void format()
{
int i;
FILE *fp;
fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址,引导区向后偏移1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1; /*引导块*/
fat[0].em_disk='1';
for(i=1;i { fat[i].item=i+1; fat[i].em_disk='1'; } fat[ROOT_DISK_NO].item=-1; /*存放根目录的磁盘块号*/ fat[ROOT_DISK_NO].em_disk='1'; for(i=ROOT_DISK_NO+1;i { fat[i].item = -1; fat[i].em_disk = '0'; } /*-----------------------------------------------*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/