文件系统实验报告.docx

上传人:b****6 文档编号:4969233 上传时间:2022-12-12 格式:DOCX 页数:16 大小:43.85KB
下载 相关 举报
文件系统实验报告.docx_第1页
第1页 / 共16页
文件系统实验报告.docx_第2页
第2页 / 共16页
文件系统实验报告.docx_第3页
第3页 / 共16页
文件系统实验报告.docx_第4页
第4页 / 共16页
文件系统实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

文件系统实验报告.docx

《文件系统实验报告.docx》由会员分享,可在线阅读,更多相关《文件系统实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

文件系统实验报告.docx

文件系统实验报告

实验二文件系统

实验报告

1.实验简介

本实验要求在假设得I/O系统之上开发一个简单得文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节.用户通过create, open,read等命令与文件系统交互.文件系统把磁盘视为顺序编号得逻辑块序列,逻辑块得编号为0至L—1。

I/O系统利用内存中得数组模拟磁盘。

实际物理磁盘得结构就是多维得:

有柱面、磁道、扇区等概念。

I/O系统得任务就是隐藏磁盘得结构细节,把磁盘以逻辑块得面目呈现给文件系统。

逻辑块顺序编号,编号取值范围为0 至L、、 1,其中L表示磁盘得存储块总数。

实验中,我们可以利用字符数组ldisk[L][B]构建磁盘模型,其中B表示每个存储块得长度。

I/O系统从文件系统接收命令,根据命令指定得逻辑块号把磁盘块得内容读入命令指定得内存区域,或者把命令指定得内存区域内容写入磁盘块.

我设计得文件系统拥有三个用户.

二。

具体说明

1、文件系统得组织:

磁盘得前k个块就是保留区,其中包含如下信息:

位图与文件描述符。

位图用来描述磁盘块得分配情况.位图中得每一位对应一个逻辑块.创建或者删除文件,以及文件得长度发生变化时,文件系统都需要进行位图操作.前k个块得剩余部分包含一组文件描述符。

每个文件描述符包含如下信息:

•文件长度,单位字节

• 文件分配到得磁盘块号数组。

该数组得长度就是一个系统参数.在实验中我们可以把它设置为一个比较小得数,例如3。

2。

目录:

我们得文件系统中仅设置一个目录,该目录包含文件系统中得所有文件.除了不需要显示地创建与删除之外,目录在很多方面与普通文件相像。

目录对应0 号文件描述符。

初始状态下,目录中没有文件,所有,目录对应得描述符中记录得长度应为0,而且也没有分配磁盘块.每创建一个文件,目录文件得长度便增加一分。

目录文件得内容由一系列得目录项组成,其中每个目录项由如下内容组成:

•文件名

• 文件描述符序号

3、对文件得操作:

文件系统需提供如下函数;create,destroy,open,read,write。

•create():

根据指定得文件名创建新文件.

• destroy():

删除指定文件。

•open():

打开文件.该函数返回得索引号可用于后续得read,write, lseek,或close操作。

•close(index):

关闭制定文件.

•read(index,mem_area,count):

 从指定文件顺序读入count个字节mem_area指定得内存位置。

读操作从文件得读写指针指示得位置开始。

• write(index,mem_area,count):

把mem_area指定得内存位置开始得count个字节顺序写入指定文件。

写操作从文件得读写指针指示得位置开始。

•lseek(index,pos):

 把文件得读写指针移动到pos 指定得位置。

pos就是一个整数,表示从文件开始位置得偏移量。

文件打开时,读写指针自动设置为0。

每次读写操作之后,它指向最后被访问得字节得下一个位置.lseek 能够在不进行读写操作得情况下改变读写指针能位置。

•directory:

 列表显示所有文件及其长度。

三。

实验过程

创建文件create:

此时显示文件中得文件:

文件得删除delete:

打开文件(open):

文件得写操作(write):

读文件(read):

关闭文件(close):

退出系统(exit):

四。

实验代码

#include〈stdio、h〉

#include〈malloc、h>

#include

#include

#define NULL0

typedefstructmdf{//MDF结构体

char username[20];//用户名

ﻩchar[20];//文件名

structmdf*next;

}MDF;

typedef structufd{//UFD结构体

char [20];//文件名

intprotect;//文件保护码

unsigned intlength;//文件长度

ﻩstructufd*next;

}UFD;

typedefstructafd{//AFD结构体

char [20];//文件名

ﻩintprotect;//文件保护码

unsigned intpoint;//文件读写指针

structafd*next;

}AFD;

MDF*pmdf;//全局链表头指针

UFD*pufd;

AFD *pafd;

charUserUFD[20];//已经登陆成功得用户名

voidinitMDF()//初始化MDF表

ﻩFILE*fp;

pmdf= (MDF*)malloc(sizeof(MDF));

ﻩMDF*p=pmdf;

if((fp= fopen("MDF”,”r+"))==NULL){//打开MDF文件

ﻩputs("theMDFcannotopen!

\n”);

ﻩﻩexit

(1);

ﻩwhile(!

feof(fp)){//把MDF文件中得内容装入链表

ﻩﻩp-〉next=(MDF*)malloc(sizeof(MDF));

p = p-〉next;

ﻩfscanf(fp,"%s",p-〉username);

fscanf(fp, ”%s”,p—>);

ﻩp-〉next=NULL;

ﻩfclose(fp);

}

voidprintUFD()//打印MDF表

{

ﻩUFD*p=pufd-〉next;

ﻩputs("文件名\t\t保护码\t\t文件长度\n");

ﻩwhile (p){

ﻩprintf("%s",p—>);

ﻩprintf("\t\t%d", p-〉protect);

ﻩprintf("\t\t%d\n",p-〉length);

ﻩp=p->next;

voidinitUFD(char*name)//初始化UFD表

{

ﻩFILE *fp;

pufd=(UFD*)malloc(sizeof(UFD));

UFD*p= pufd;

if((fp= fopen(name, ”r+")) ==NULL){

puts("theUFDcannotopen!

\n");

ﻩexit(1);

ﻩ}

ﻩwhile(!

feof(fp)){//建立UFD链表

p—>next=(UFD*)malloc(sizeof(UFD));

p =p->next;

fscanf(fp,"%s",p-〉);

ﻩﻩfscanf(fp,"%d”,&p-〉protect);

fscanf(fp,”%d",&p—>length);

ﻩfgetc(fp);

ﻩ}

p->next= NULL;

fclose(fp);

intcheckuser()//检测登陆得用户名

charusername[20];

while

(1){

ﻩputs(”请输入用户名:

\n");

ﻩﻩscanf("%s",username);

ﻩMDF *p=pmdf;

ﻩwhile(p){

ﻩﻩﻩif(strcmp(username, p->username)==0){

ﻩﻩﻩstrcpy(UserUFD,p-〉);

ﻩinitUFD(p->);

ﻩﻩﻩprintUFD();

ﻩreturn1;

ﻩ}

ﻩp=p->next;

ﻩﻩ}

ﻩputs(”同户名不存在\n");

ﻩ}

void initAFD()//初始化AFD

ﻩpafd=(AFD*)malloc(sizeof(AFD));

pafd—>next= NULL;

}

boolcreate()//创建文件命令

ﻩchar [20];

UFD*p= pufd->next;

AFD*pa =pafd;

ﻩputs("请输入要创建得文件名:

\n");

scanf(”%s”,);

while (p){

ﻩﻩif(strcmp(,p—〉) ==0){

ﻩﻩputs("此文件已经存在了!

\n");

ﻩﻩﻩreturn0;

ﻩif(!

p—>next)

ﻩbreak;

ﻩﻩp= p->next;

}

p—〉next=(UFD*)malloc(sizeof(UFD));

p=p—〉next;

ﻩstrcpy(p-〉,);

p—>protect=2;

p-〉length= 0;

ﻩp->next=NULL;

while(pa—〉next){//创建文件后加入到AFD

ﻩpa=pa->next;

pa->next= (AFD*)malloc(sizeof(AFD));

ﻩpa= pa—〉next;

strcpy(pa—>,);

pa—>protect =2;

ﻩpa—〉point =0;

ﻩpa->next=NULL;

ﻩreturn 1;

bool_delete()//删除文件命令

ﻩchar[20];

ﻩputs("请输入要删除得文件名:

 \n");

scanf("%s”,);

ﻩUFD*p=pufd;

UFD*temp;

ﻩwhile(p-〉next){

ﻩﻩif(strcmp(, p->next->)==0){

ﻩﻩﻩtemp=p->next;

p—>next=p—〉next->next;

ﻩﻩfree(temp);

ﻩﻩﻩprintf("文件%s删除成功!

\n”,);

ﻩﻩreturn1;

ﻩ}

ﻩﻩp= p—〉next;

ﻩputs(”要删除得文件不存在!

\n");

ﻩreturn0;

}

boolopen()//打开文件命令

{

ﻩchar [20];

unsignedintprotect;

puts("请输入要打开得文件名:

\n”);

ﻩscanf("%s",);

ﻩputs("请输入要打开得文件保护类型:

\n”);

ﻩscanf(”%d”, &protect);

ﻩUFD*p =pufd—〉next;

ﻩAFD *pa=pafd->next;

ﻩwhile (pa){

ﻩﻩif(strcmp(,pa->)==0){

ﻩﻩprintf("文件%s已经打开!

\n”,);

ﻩreturn1;

ﻩﻩ}

if(!

pa—>next)

ﻩﻩbreak;

pa=pa->next;

ﻩ}

if(!

pa)

ﻩpa=pafd;

ﻩwhile (p){

ﻩif(strcmp(, p—>) == 0){

ﻩﻩﻩpa—〉next= (AFD*)malloc(sizeof(AFD));

ﻩﻩpa=pa->next;

strcpy(pa—> ,p->);

ﻩﻩpa—>protect =protect;

ﻩﻩif(protect ==1)

ﻩﻩpa—>point=0;

ﻩelse

ﻩﻩpa—〉point=p->length;

ﻩﻩpa—>next=NULL;

ﻩﻩprintf("文件%s已经打开!

\n”,);

ﻩﻩreturn1;

}

ﻩﻩp= p—>next;

puts("要打开得文件不存在!

\n”);

return0;

}

voidclose()//关闭文件命令

ﻩchar[20];

ﻩUFD*pu= pufd->next;

ﻩputs("请输入要关闭得文件名:

\n”);

ﻩscanf("%s",);

ﻩAFD *p= pafd;

AFD *temp;

ﻩwhile(p&&p-〉next){

ﻩif(strcmp(, p->next—>)==0){

ﻩtemp=p—>next;

ﻩﻩﻩp->next=p—〉next-〉next;

if(temp->protect==2){

ﻩﻩwhile(pu){

ﻩﻩﻩif(strcmp(temp->,pu->)==0){

ﻩﻩﻩﻩpu->length=temp->point;

ﻩﻩﻩﻩbreak;

ﻩﻩﻩ}

ﻩﻩﻩpu=pu->next;

ﻩﻩﻩﻩ}

ﻩﻩ}

free(temp);

printf(”文件%s关闭成功!

\n”,);

ﻩﻩﻩreturn;

ﻩ}

ﻩﻩp= p-〉next;

}

ﻩﻩputs(”要关闭得文件没有被打开!

\n”);

intread()//读文件命令

char [20];

unsignedint length;

ﻩAFD*p=pafd—>next;

puts("请输入要读得文件名:

\n");

scanf("%s”,);

ﻩputs("请输入要读得长度\n");

ﻩscanf("%d", &length);

while(p){

if(strcmp(,p->)== 0){

ﻩﻩﻩp—>point+= length;

ﻩprintf("文件%s读取成功!

\n", );

ﻩﻩreturn 1;

ﻩ}

ﻩp=p—〉next;

ﻩ}

ﻩputs("读取失败文件没有打开过!

\n");

ﻩreturn 0;

}

intwrite()//写文件命令

{

char[20];

unsignedintlength;

ﻩAFD*p =pafd->next;

puts("请输入要写得文件名:

 \n”);

scanf(”%s",);

while(p){

if(strcmp(,p->)==0){

ﻩﻩif(p->protect!

=2){

ﻩﻩprintf("文件%s不可写!

\n”,);

ﻩﻩreturn 0;

}

ﻩﻩﻩputs(”请输入要写得长度\n");

ﻩﻩscanf("%d",&length);

ﻩp-〉point +=length;

ﻩprintf("文件%s写入成功!

\n",);

return1;

}

p=p->next;

ﻩ}

ﻩputs("写入失败文件没有打开过!

\n");

ﻩreturn0;

}

void destroy()//释放内存

ﻩMDF *pm =pmdf;

ﻩwhile(pm){

ﻩpmdf= pmdf-〉next;

ﻩﻩfree(pm);

pm=pmdf;

ﻩ}

ﻩAFD*pa=pafd;

ﻩwhile(pa){

ﻩpafd=pafd—〉next;

ﻩfree(pa);

ﻩpa = pafd;

ﻩ}

UFD*pu= pufd;

ﻩwhile(pu){

ﻩpufd =pufd—>next;

ﻩfree(pu);

ﻩpu= pufd;

ﻩ}

}

voidsaveUFD()//保存UFD文件

FILE*fp;

ﻩUFD*p=pufd->next;

ﻩif((fp =fopen(UserUFD,"w”))==NULL){

ﻩputs(”theUFDcannotopen!

\n”);

ﻩexit(1);

while(p){

ﻩﻩfprintf(fp, ”%s",”\n”);

fprintf(fp, "%s%s",p—>,"\t\t");

ﻩfprintf(fp, ”%d%s",p—〉protect,”\t\t");

ﻩfprintf(fp,"%d”, p—>length);

ﻩﻩp=p->next;

ﻩ}

ﻩfclose(fp);

voidexit()//推出系统

{

ﻩAFD*pa= pafd—〉next;

UFD*pu=pufd->next;

while(pa){

ﻩif(pa->protect ==2){

while(pu){

ﻩﻩif(strcmp(pa->, pu->)==0){

ﻩpu-〉length=pa—〉point;

ﻩbreak;

ﻩ}

ﻩﻩpu=pu->next;

ﻩ}

ﻩ}

ﻩpa =pa—〉next;

ﻩ}

saveUFD();

printUFD();

ﻩdestroy();

}

voidoperate()//命令识别

{

while

(1){

ﻩchar mand[20];

ﻩﻩcharname[][8]={"create","delete”,”open", "close","read",”write”,”exit"};

ﻩputs("请输入命令:

 \n”);

scanf("%s",mand);

if(strcmp(mand,name[0])== 0)

ﻩcreate();

ﻩelseif(strcmp(mand,name[1]) ==0)

ﻩﻩ_delete();

ﻩﻩelseif(strcmp(mand,name[2])==0)

ﻩﻩopen();

ﻩelseif(strcmp(mand,name[3])==0)

close();

ﻩﻩelse if(strcmp(mand,name[4])== 0)

ﻩﻩread();

ﻩﻩelse if(strcmp(mand,name[5]) ==0)

ﻩwrite();

elseif(strcmp(mand, name[6] ) ==0){

ﻩﻩﻩexit();

ﻩreturn;

ﻩ}else

ﻩﻩputs("无效命令,请重新输入:

\n");

}

}

void print()

puts("文件系统\n”);

puts("***使用说明***:

\n");

ﻩputs("本文件系统共有三个用户分别就是user1user2 user3\n\

ﻩ系统命令有create, delete, open,close,read, write,exit\

\nexit—---—----——-—--—--——---—----—--—---——-—-退出系统”);

intmain()

{

print();

initMDF();

checkuser();

ﻩinitAFD();

ﻩoperate();//命令识别

ﻩreturn0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1