没有合适的资源?快使用搜索试试~ 我知道了~
操作系统文件管理系统模拟实验.doc
资源推荐
资源详情
资源评论
操作系统文件管理系统模拟实验
文件管理系统模拟
1.实验目的
通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现
2.实验内容
为 Linux 系统设计一个简单的二级文件系统。要求做到以下几点:
(1)可以实现下列几条命令(至少 4 条)
login 用户登录
dir 列文件目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
3.实验提示
(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录
和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。入 file0,file1,file2…并以
编号作为物理地址,在目录中进行登记。
4.源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#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<ROOT_DISK_NO-1;i++)
/*存放 FAT 表的磁盘块号*/
{
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<DISK_N
UM;i++)
{
fat[i].item = -1;
fat[i].em_disk = '0';
}
/*---------------------------
--------------------*/
root = (struct direct
*)(fdisk+DISKSIZE+FATSIZE); /* 根
目录的地址*/
/*初始化目录*/
/*---------指向当前目录的目录
项---------*/
root->directitem[0].sign = 1;
root->directitem[0].firstdisk
= ROOT_DISK_NO;
strcpy(root->directitem[0].na
me,".");
root->directitem[0].next =
root->directitem[0].firstdisk;
root->directitem[0].property
= '1';
root->directitem[0].size =
ROOT_DISK_SIZE;
/*-------指向上一级目录的目录
项---------*/
root->directitem[1].sign = 1;
root->directitem[1].firstdisk
= ROOT_DISK_NO;
strcpy(root->directitem[1].na
me,"..");
root->directitem[1].next =
root->directitem[0].firstdisk;
root->directitem[1].property
= '1';
root->directitem[1].size =
ROOT_DISK_SIZE;
if((fp =
fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot
open file \n");
return;
}
for(i=2;i<MSD+2;i++) /*-子目录
初始化为空-*/
{
root->directitem[i].sign =
0;
root->directitem[i].firstdisk
= -1;
strcpy(root->directitem[i].na
me,"");
root->directitem[i].next =
-1;
root->directitem[i].property
= '0';
root->directitem[i].size =
剩余17页未读,继续阅读
资源评论
是空空呀
- 粉丝: 178
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功