当前位置:文档之家› 浙江工业大学模拟UNIX系统实验

浙江工业大学模拟UNIX系统实验

2013-2014(1)操作系统原理课程大型实验报 告
模拟 Unix 文件系统
软件工程(2+2)2 班 201326740214 唐高望 201326740226 殷烨露 201326740220 项耀军
一、 实验要求
1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存 储
2.文件系统的目录结构采用类似 Linux 的树状结构; 3.要求模拟的操作包括:
if(i < InputName.length()){ //不再当前目录下创建;//截断路径 int LastF; for(LastF = (InputName.length() - 1);InputName[LastF] !=
F;LastF--); char Path[50]; Path[LastF] = '$'; for(int j = 0;j<LastF;j++){ Path[j] = InputName[j]; } _NowDirID = FindPath(_NowDirID,Path); if( _NowDirID == 0) return false;
//检测是否有重名 for(int CurID = fcb[dFilePid].sID ; CurID != -1 ; CurID = fcb[CurID].nID ){
if(fcb[CurID].F == 2 && fcb[CurID].Name == InputName){ cout<<"目的目录下有同名文件,操作失败...\n"; return false;
string RemName = ""; for(LastF++; LastF < InputName.length() ;LastF++){
}else{ break;
} if(Index[3][IndexID] != -1){
//使用了间接索引; IndexID = Index[3][IndexID]; BlockID = Index[1][IndexID]; WriteBitMap( 0 ,BlockID); Index[0][IndexID] = 0; }else{ break; } } SaveIndexAndBitmap(); } //相邻目录或文件建立连接 int pDironePointDirID = fcb[_FileIDpID].sID; int pDirtwoPointDirID = fcb[pDironePointDirID].nID; int CurID = pDirtwoPointDirID; for(; fcb[CurID].nID != FileID ;CurID = fcb[CurID].nID); fcb[CurID].nID = fcb[FileID].nID; fcb[FileID].F = 0; }
string InputName; cin>>InputName; char F = '\\';
//检测输入是否正确 if(InputName[InputName.length()-1] == F){
cout<<"给出的文件名有误..."<<endl; return false; }
//检测是否在当前目录下创建 int i; for(i = 0;i < InputName.length() && InputName[i] != F;i++);
return true; } bool mvDir(int _NowDirID){
int sDirPid; intFindDirID(_NowDirID); if( sID == -1) return false; int onepointDirID = fcb[sID].sID; int twopointDirID = fcb[onepointDirID].nID; sDirPid = fcb[twopointDirID].sID;
int RmEmptyDir(int DirID){ //删除空目录,返回父目录; fcb[DirID].F = 0; int onePointDirID = fcb[DirID].sID; fcb[onePointDirID].F = 0; int twoPointDirID = fcb[onePointDirID].nID; fcb[twoPointDirID].F = 0; int ReturnID = fcb[twoPointDirID].sID;
string RemName = ""; for(LastF++; LastF < InputName.length() ;LastF++){
RemName = RemName + InputName[LastF]; } InputName = RemName; }
dFilePid = _NowDirID;
(512B)包含 32 个目录项。在目录项中,第 1、2 字节为相应文件的外存 i 节点号,
是该文件的内部标识;后 14B 为文件名,是该文件的外部标识。所以,文件目
录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存 i 节点号,
由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX 的存
string InputName; cin>>InputName; char F = '\\';
//检测输入是否正确 if(InputName[InputName.length()-1] == F){
cout<<"给出的目录名有误..."<<endl; return false; }
//检测是否在当前目录下创建 int i; for(i = 0;i < InputName.length() && InputName[i] != F;i++);
}
void RmFile(int FileID,int _FileIDpID){
//删除文件
if(fcb[FileID].sID != -1){
//释放索引表
int IndexID;
int BlockID;
IndexID = fcb[FileID].sID;
BlockID = Index[1][IndexID];
a) 目录的添加、删除、重命名; b) 目录的显示(列表) c) 文件的添加、删除、重命名 d) 文件和目录的拷贝 4.用户进入时显示可用命令列表;用户输入 help 时显示所有命令的帮助文 档; 输入某个命令--?(或者—help)时显示该条命令的使用说明 5.用户输入 exit 时退出该系统 6.实验实现基于 linux 平台; 7.实验开发语言可以选用 C/C++
四、 部分源代码
bool RemoveFile(int _NowDirID){ int FileIDpID; int FileID = FindFileID(_NowDirID,&FileIDpID); if(FileID == -1){ cout<<"文件名有误,操作失败...\n"; return false; } RmFile(FileID,FileIDpID); SaveFCB(); return true;
WriteBitMap( 0 ,BlockID);
//
释放文件块;
Index[0][IndexID] = 0;
//
释放索引表;
while(1){
if(Index[2][IndexID] != -1){ BlockID = Index[2][IndexID]; WriteBitMap( 0 ,BlockID);
} }
fcb[sID].Name = InputName; fcb[sID].nID = -1;
//检测是否在相同目录下 if(sFilePid != dFilePid){
int CurID = fcb[dFilePid].sID; while(fcb[CurID].nID != -1) CurID = fcb[CurID].nID;
储介质以 512B 为单位划分为块,从 0 开始直到最大容量并顺序加以编号就成了
一个文件卷,也叫文件系统。UNIX 中的文件系统磁盘存储区分配图如下:
0#
1#
2#

K# K+1# K+2# K+3# …
n#
引导区 管理区
i 节点区
文件存储区
本次实验设计是要实现一个简单的模拟 UNIX 文件系统。我们在磁盘中申请 一个二进制文件模拟 UNIX 内存,依次初始化建立位示图区,I 节点区,数据块 区。并给已打开的文件建立文件打开表。
命令定义如下
ls pwd cd mkdir rmdir mv cp rm passwd
显示文件目录 显示当前目录 改变当前目录 创建子目录 删除子目录 改变文件名 文件拷贝 文件删除 修改用户口令
二、 实验原理
UNIX 采用树型目录结构,每个目录表称为一个目录文件。
一个目录文件是由目录项组成的。每个目录项包含 16B,一个辅存磁盘块
//相邻目录或文件建立连接 int pDironePointDirID = fcb[ReturnID].sID; int pDirtwoPointDirID = fcb[pDironePointDirID].nID; int CurID = pDirtwoPointDirID; for(; fcb[CurID].nID != DirID ;CurID = fcb[CurID].nID); fcb[CurID].nID = fcb[DirID].nID; return ReturnID; }
相关主题