操作系统实验报告(6)

2019-03-09 20:36

实验三: 二级目录文件系统

课程设计目的:

通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识。

实验原理:

系统中有一个主文件目录(MFD),每个已注册的用户在该目录中占据一个表目,其内容包括用户名、口令、用户目录指针、链指针等,系统启动时,首先建立主文件目录。

每个已注册用户拥有一个自己的用户文件目录(UFD),该用户的每一个文件均在UFD中占据一个表目,其内容包括文件名、保护码、文件长度、链指针等。每创建一个文件要在UFD中加入一个表项,每删除一个文件也要UFD中删除其对应表目。其它对文件的操作也要对UFD进行相应修改。对即将要进行访问的文件,系统建立一个活动文件目录AFD,用于存放已打开文件的有关信息。设系统最多可同时打开5个文件,每个已打开的文件在AFD中占据一个表目,内容包括:打开文件名、打开文件保护码、读指针、写指针4项。文件关闭时,撤消其在AFD中的对应表项。

系统首先进行初始化,建立MFD,然后注册一批用户,初始化AFD,随后处于待命状态. 创建文件: 输入文件名、保护码、长度、生成一个UFD块并挂在该用户的UFD链链尾。 删除文件:输入文件名,在该用户的UFD链中删除该文件对应的UFD块。若该文件是已打开的文件,还要删除其在AFD中的对应表目。

数据结构:

typedef struct MFD//主文件目录

{

char userName[14];//用户名 char passNumber[14];//密码 int ufdLink;//块号

}mfd;

typedef struct UFD//用户文件目录 {

26

char fileExist[9]; //文件是否存在标志位 char fileName[14]; //文件名14B;

char fileMode; //文件权限0-readonly;1-writeonly;2-read/write int fileLength; ///文件长度

int fileFirstBlock;//该文件的第1个文件块对应的物理块号

}ufd;

源码分析:

int Write(string s,string t,int n) { cmRead.readUof(userUof); list::iterator it;

for(it=userUof.begin();it!=userUof.end();++it) { if(it->fileName==s) { //找到了该文件 //计算文件长度,块号 int len,addr;

len=cmRead.readUfdFileLength(it->filePoint); addr=cmRead.readUfdFileAddr(it->filePoint); //更新ufd

list::iterator im;

for(im=userUfd.begin();im!=userUfd.end();++im) { if(im->fileName==s) {

im->fileLength+=n;

27

break;

}

}

cmRead.reWriteUfdTotal(userUfd,usermfd.ufdLink); //写文件

cmRead.findLastBlockOfFile(addr,len); cmRead.writeFile(addr,len,t.substr(0,n));

//更新uof it->writeP+=n;

cmRead.reWriteUof(userUof);

cout<<\写入成功\\n\ return 13;

}

}

list::iterator iu; int count=0;

for(iu=userUfd.begin();iu!=userUfd.end();++iu) { count++;

if(iu->fileName==s) {

//找到该文件,先打开,更新uof

uof ut; //文件属性在disk.txt中的位置

int position=usermfd.ufdLink*514+(count-1)*32+23; char *p=\为打开模式

ut.set(iu->fileName,position,p,0,n,2+'0');

28

userUof.push_back(ut);//在uof表的最后添加一项

cmRead.reWriteUof(userUof);//uof表重新写入disk

int m=cmRead.readUfdFileAddr(ut.filePoint); int q=cmRead.readUfdFileLength(ut.filePoint); //写文件 int lenth,block; block=iu->fileFirstBlock; lenth=iu->fileLength;

cmRead.findLastBlockOfFile(block,lenth); cmRead.writeFile(block,lenth,t.substr(0,n));

//更新Ufd

iu->fileLength+=n; }

int Open(string s,int n) {

//如果模式不满足要求0-2

if(n<0||n>2){cout<<\无该模式,模式0-readonly;1-writeonly;2-read/write,请核对输入 }

cout<<\无该文件,请检查文件名!\\n\return 13;

cmRead.reWriteUfdLength((count-1)*32+24,usermfd.ufdLink,iu->fileLength);

cout<<\写入成功\\n\ }

return 13;

\

//否则继续

cmRead.readUof(userUof);

29

list::iterator it; for(it=userUof.begin();it!=userUof.end();++it) { if(it->fileName==s) { cout<<\该文件已经打开!\\n\ return 14;

}

}

list::iterator iu; int count=0;

for(iu=userUfd.begin();iu!=userUfd.end();++iu) { count++;

if(iu->fileName==s) { uof temp; char*p=\

temp.set(iu->fileName,usermfd.ufdLink*514+(count-1)*32+23,p,0,0,n+'0'); userUof.push_back(temp); cmRead.reWriteUof(userUof); cout<<\打开成功\\n\ return 14; }

}

cout<<\无该文件,请检查文件名!\\n\ return 14;

}

int Read(string s,int n) {

30


操作系统实验报告(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:小学语文教材古诗词鉴1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: