操作系统2实验四.docx
《操作系统2实验四.docx》由会员分享,可在线阅读,更多相关《操作系统2实验四.docx(20页珍藏版)》请在冰豆网上搜索。
![操作系统2实验四.docx](https://file1.bdocx.com/fileroot1/2022-10/25/379ea15e-a844-40c2-a79c-29bfb854d8ab/379ea15e-a844-40c2-a79c-29bfb854d8ab1.gif)
操作系统2实验四
操作系统
(2)实验四
SHANGHAIUNIVERSITY
<操作系统>实验报告
学院
计算机工程与科学学院
学号
10122050
姓名
王杰
指导老师
张建
日期
2014.03.07
实验四文件操作与管理
一、实验环境
VisualC++
二、实验目的
随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。
因此,文件管理是操作系统的一个极为重要的组成部分。
学生应独立地用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。
三、实验要求
(1)实际一个n个用户的文件系统,每个用户最多可保存m个文件。
(2)限制用户在一次运行中只能打开l个文件。
(3)系统应能检查打入命令的正确性,出错要能显示出错原因。
(4)对文件必须设置保护措施,如只能执行,允许读、允许写等。
在每次打开文件时,根据本次打开的要求,再次设置保护级别,即可有二级保护。
(5)对文件的操作至少应有下述几条命令:
creat建立文件。
delete删除文件。
open打开文件。
close关闭文件。
read读文件。
write写文件。
四、实验内容
(1)本实习设计一个10个用户的文件系统,每个用户最多可保存10个文件,一次运行中用户可打开5个文件。
(2)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。
前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。
另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件
号,本次打开保护码和读写指针等。
(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不进行实际文件的读写操作。
五、设计思路
1.因系统小,文件目录的检索使用了简单的线性搜索,而没有采用Hash等有效算法。
2.文件保护简单实用了三位保护码,对应于允许读、允许写和运行执行,如下所示:
111
允许写允许读允许执行
如对应位为0,则不允许。
3.程序中使用的主要数据结构如下:
①主文件目录和用户文件目录
打开文件目录:
4.程序框图:
六、实验过程
1.整个程序运行过程如下:
输入用户名—>在MFD中查找—>显示UFD文件链表—>初始化AFD运行文件表
—>输入操作命令—>执行操作命令—>保存文件目录—>打印文件目录—>结束
2.MFD、UFD和AFD的结构定义如下:
structUFD
{
stringfilename;
intpro[3];
intcodel;
UFD*next;
};
structMFD
{
选择CLOSE命令后,输入需要关闭的文件名,在UFD中搜索是否有该文件名。
(1)若无则报错;
(2)若有,还要分两种情况:
●通过检查,该文件并未被打开,则报错
●存在该文件,且被打开,则正常调用voidClose1(AFD*f),关闭文件。
3.voidDelete()删除一个文件
选择DELETE命令后,输入需要删除的文件名,在UFD中搜索是否有该文件名:
(1)若无则报错;
(2)若有,还要分两种情况:
●通过检查,该文件已被打开,则需要先关闭该文件,确定需要关闭该文件后,通过调用voidClose1(AFD*f),关闭文件,然后删除该文件。
●存在该文件,且未被打开,则课正常删除该文件,即重新初始化该文件的UDF结点。
4.voidRead()读一个文件
读文件的关键是保护码的判断。
选择了READ命令后,输入需要读的文件名,在UFD中搜索是否有该文件名:
(1)若有,但该文件没被打开,则报错;
(2)若有,且已被打开,此处要分两种情况:
●如果保护码的读位为“0”,则不能对该文件进行读操作。
●否则,就通过文件号来读文件,即通过AFD中的point指针来查找该文件。
5.voidWrite()写一个文件
写文件的关键也是保护码的判断。
选择了WRITE命令后,输入需要读的文件名,在UFD中搜索是否有该文件名:
(1)若有,但该文件没被打开,则报错;
(2)若有,且已被打开,此处要分两种情况:
●如果保护码的写位为‘0’,则不能对该文件进行写操作。
●否则,就可以通过文件号来写文件,即通过AFD中的point指针来查找。
6.Bye退出
选择了BYE命令后,程序退出并保存当前目录,然后将结果打印出来。
程序运行结果
1.用户验证
2.创建文件
3.关闭、打开文件
4.删除文件
5.读写文件
6.退出
七、感想体会
实验四主要是通过链表来实现对文件的管理的,要求设计一个10个用户的文件系统,每个用户最多可保存10个文件,一次运行中用户可打开5个文件。
程序采用了二级文件目录,设置了主文件目录和用户文件目录,另外为打开文件设置了运行文件目录,在文件打开时应填入打开文件号,本次打开保护码和读写指针。
在执行各种文件操作命令的时候,需要考虑多种情况,比如读写文件的时候就要考虑文件的保护码,以及该文件是否已被打开的问题;创建命令时要在用户的文件目录中寻找空闲的文件结点,即没有被使用的文件,对其进行文件名、保护码、文件长度的设置;删除命令就要考虑是否有这个文件,再查看此文件是否被打开,如果已经被打开,则要先关闭该文件,在进行删除,删除即对此文件结点进行初始化操作等等。
想清楚各项操作的分类情况之后,对每个函数进行编写就容易多了。
本次试验模拟了文件的管理操作,虽然只是一个小小的程序,也让我大致了解了计算机对于文件的管理是如何进行的。
由于是通过链表的操作实现的,也使我巩固了C++中的链表操作过程。
实验源代码:
#include
#include
#include
usingnamespacestd;
stringa[10]={"Carol","Lily","Lucy","Bob","A","B","C","D","E","F"};
stringcommand[7]={"CREATE","DELETE","OPEN","CLOSE","READ","WRITE","BYE"};
structUFD
{
stringfilename;
intpro[3];
intcodel;
UFD*next;
};
structMFD
{
stringusername;
UFD*file;
MFD*next;
};
structAFD
{
intfilenum;
charfilepro[3];
UFD*point;
AFD*next;
};
AFD*openfile=NULL;
MFD*user=NULL;
MFD*thisuser;//当前用户
voidinit()//初始化函数
{
intx=0;
for(inti=0;i<10;i++)
{
MFD*p;
p=newMFD;
p->username=a[x];
UFD*fhead=NULL;
for(intj=0;j<10;j++)
{
UFD*q;
q=newUFD;
q->filename="******";
for(inta=0;a<3;a++)
{q->pro[a]=0;}
q->codel=0;
q->next=fhead;
fhead=q;
p->file=fhead;
if(j==9)//变成循环链表
{
UFD*r=fhead;
while(r->next!
=NULL)
{r=r->next;}
r->next=fhead;
}
}
p->next=user;
user=p;
x++;
}
//AFD的初始化
for(inti=0;i<5;i++)
{
AFD*f;
f=newAFD;
f->filenum=5-i;
for(intj=0;j<3;j++)
{f->filepro[j]=0;}
f->point=NULL;
f->next=openfile;
openfile=f;
if(i==4)//打开文件链表设为循环链表
{
AFD*p=openfile;
while(p->next!
=NULL)
{p=p->next;}
p->next=openfile;
}
}
}
intcheckUser(stringusername)
{
MFD*p;
for(p=user;p!
=NULL;p=p->next)
{
if(p->username==username){break;}
}
if(p!
=NULL)
{thisuser=p;return1;}
else{return0;}
}
voidshow()
{
cout<<"YOURFILEDIRECTORY"<cout<:
left)<cout<:
left)<cout<:
left)<MFD*p=thisuser;
UFD*q=p->file;
for(inti=0;i<10;i++)
{
cout<:
left)<filename;
cout<pro[0]<pro[1]<pro[2];
cout<:
left)<cout<:
left)<codel<q=q->next;
}
}
voidOpenMode(UFD*p,stringname)
{
AFD*f=openfile;
inti;
for(i=0;i<5;i++)
{
if(f->point!
=NULL&&f->point->filename==name){cout<<"THISFILEISALREADYOPENED!
"<f=f->next;
}
for(i=0;i<5;i++)
{
if(f->point==NULL)break;
f=f->next;