操作系统实验报告
1
实验二
一、实验题目及要求
1.实验题目
模拟采用二级目录结构的磁盘文件系统中的文件操作。
2.实验目的
(1)进一步认识文件系统的内部功能以及内部实现;
(2)深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
3.实验要求
(1)设计一个支持 N 个用户的简单二级文件系统,每个用户可保存 L 个文件;
(2)文件的使用权限为“只可读”或“可读可写”;
(3)文件系统提供的文件操作有:Create 建立文件、Open 打开文件、Close 关闭文
件、Read 读文件、Write 写文件和 Delete 删除文件。
(4)通过键盘使用该文件系统,系统应显示操作命令的执行结果。
二、姓名、学号、所在地区、工作单位等个人信息
三、实验地点、环境、日期
1、实验地点:西安电子科技大学
2、实验环境
操作系统:Windows XP
开发语言:VC++
开发工具:Microsoft Visual C++ 6.0
3、日期:2011 年 11 月 24 日
四、程序中所用的数据结构、实验步骤、算法及说明
1.数据结构
通过阅读实验指导书,整理出实验大体的思路,确定实体以及它们之间的关系。实体
关系有三张表(主文件目录,用户文件目录以及打开文件目录)、命令服务和用户构成。用
户负责输入命令。命令服务实现命令检查以及调用相关模块执行相应的命令功能。
(1)主文件目录(MFD),包括用户名和文件目录指针;
struct user MFD[1]={{"0",0}};//MFD(用户名文件目录 指针)
(2)用户文件目录(UFD),包括文件名、保护码以及文件长度;
struct file UFD[10];//用户文件目录(UFD-文件名保护码文件长度)
(3)打开文件目录(AFD),包括打开文件名、打开保护码以及读写指针。采用数组形
式存储打开的文件,数组每个元素保存一个打开文件的信息
2
struct file AFD[5]={{"0",0,0,0},{"0",0,0,0},{"0",0,0,0},{"0",0,0,0},{"0",0,0,0}};//运行
文件目录(AFD)——一次运行用户可以打开个文件
2、实验步骤
(1)首先确定实体并根据题目要求设计出实体的数据结构;
(2)分析并描述实体之间的联系;
(3)根据实验指导书中给出的各程序结构流程图,编写程序代码;
(4)调试所编程序,发现问题并进行修改,确保所编程序能够正确执行并达到实验题
目的要求。
3、算法及说明
(1)实验算法流程图
开始
初始化文件目录表
初始化己开文件表
输入用户名
MFD 中有该用户?
输入命令
分析命令
显示无此用户
create
open
close
write
delete
read
d
建立
打开
关闭
读
写
撤消
end
其他
结束
显示:命令错
(2)算法设计及说明
该程序可分为以下几个模块:
void login():此模块的作用是实现用户登录功能,用户登录成功则可以使用系统功能;
3
void dir():显示出该目录下的所有文件。
void create():创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
对于重名文件给出错误信息。
void delet():当没在用户使用指定文件时,将其删除。文件不存在时给出错误信息。
void open():打开用户文件目录中已创建的文件,显示打开成功。若文件不存在,则提示
用户该输入有误。
void close():关闭用户文件目录中存在并且已打开的文件,显示关闭成功。若文件不存
在,则提示用户该输入有误。
void read():系统先判断在用户文件目录上是否存在该文件,若存在则判断该文件是否已
打开,接着判断该文件的权限,若能读取则显示“该文件的状态是正在读”,若权限不够,
则提示该错误信息。
void write():若要写的文件既不是在用户文件目录上不存在的也不是未打开的,则接着
判断该用户是否有权限写入文件,若有权限,则显示出“文件的状态是正在写”,若无权限,
则提示该错误信息。
void save():
五、程序清单
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include
using namespace std;
#define NULL 0
int count=0;
struct file{
char name[10];//文件名
int code;//保护码
int size;//文件长度
char pwrite;//读写指针
};
struct user{
char name[10];
struct file *list;//目录指针
};
//初始化各用户文件
struct file one[10]={{"a1",1,10,0},{"a2",2,10,0},{"a3",1,10,0},
{"a4",1,10,0},{"a5",0,10,0},{"a6",2,10,0},{"a7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file two[10]={{"b1",0,10,0},{"b2",2,10,0},{"b3",1,10,0},
{"b4",2,10,0},{"b5",2,10,0},{"b6",2,10,0},{"b7",2,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file three[10]={{"c1",0,10,0},{"c2",2,10,0},{"c3",1,10,0},
{"c4",2,10,0},{"c5",2,10,0},{"c6",2,10,0},{"c7",1,10,0},{"0",0,0,0},
4
{"0",0,0,0},{"0",0,0,0}};
struct file four[10]={{"d1",0,10,0},{"d2",2,10,0},{"d3",1,10,0},
{"d4",2,10,0},{"d5",2,10,0},{"d6",2,10,0},{"d7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file five[10]={{"e1",0,10,0},{"e2",2,10,0},{"e3",1,10,0},
{"e4",2,10,0},{"e5",2,10,0},{"e6",2,10,0},{"e7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file six[10]={{"f1",0,10,0},{"f2",2,10,0},{"f3",1,10,0},
{"f4",2,10,0},{"f5",2,10,0},{"f6",2,10,0},{"f7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file seven[10]={{"g1",0,10,0},{"g2",2,10,0},{"g3",1,10,0},
{"g4",2,10,0},{"g5",2,10,0},{"g6",2,10,0},{"g7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file eight[10]={{"h1",0,10,0},{"h2",2,10,0},{"h3",1,10,0},
{"h4",2,10,0},{"h5",2,10,0},{"h6",2,10,0},{"h7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file nine[10]={{"j1",0,10,0},{"j2",2,10,0},{"j3",1,10,0},
{"j4",2,10,0},{"j5",2,10,0},{"j6",2,10,0},{"j7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file ten[10]={{"k1",0,10,0},{"k2",2,10,0},{"k3",1,10,0},
{"k4",2,10,0},{"k5",2,10,0},{"k6",2,10,0},{"k7",1,10,0},{"0",0,0,0},
{"0",0,0,0},{"0",0,0,0}};
struct file UFD[10];//用户文件目录(UFD-文件名 保护码 文件长度)
struct file AFD[5]={{"0",0,0,0},{"0",0,0,0},{"0",0,0,0},{"0",0,0,0},{"0",0,0,0}};//运行文件
目录(AFD)——一次运行用户可以打开 5 个文件
///////////////////////////////////////////////////////////////
struct user use[10]={{"number1",one},{"number2",two},{"number3",three},{"number4",four},
{"number5",five},{"number6",six},{"number7",seven},{"number8",eight},{"number9",nine},
{"number10",ten}};
struct user MFD[1]={{"0",0}};//MFD(用户名 文件目录指针)
///////////////////////////////////////////////////////////////////
void login();
void dir();
void create();
void delet();
void open();
void close();
void read();
void write();
void save();
5
///////////////////////////////////////////////////////////////////
void main(){
login();
dir();
cout<<"操作己结束"<>order;
switch(order){
case 'c':create();break;
case 'd':delet();break;
case 'o':open();break;
case 'k':close();break;
case 'r':read();break;
case 'w':write();break;
case 's':save();break;
case 'e':login();break;
default :cout<<"输入命令出错,请重输"<>name;
6
flag=0;
for(i=0;i<10;i++){
if(strcmp(UFD[i].name,name)){
//如果没有这个文件
/*strcmp 函数是比较两个字符串的大小,返回比较
的结果:①字符串 1 小于字符
串 1 等于字符串 2,strcmp 函数返回零;③
串 2,strcmp 函数返回一个负值;
② 字 符
字符串 1 大于字符串 2,strcmp 函数返回一个正
值;*/
所指的数组中。
flag=1;
}//break;
else{
flag=0;
strcpy(UFD[i].name,"0");//清空文件 把 src 所指由 NULL 结束的字符串复制到 UFD
UFD[i].code=0;
UFD[i].pwrite=0;
UFD[i].size=0;
cout<<"该文件己被删除"<>name;
flag=0;
for(i=0;i<10;i++){
if(strcmp(UFD[i].name,name)){ //如果没有这个文件
flag=1;}
//break;
else{
flag=0;
break;
7
}
}
if(flag==1)
cout<<"无此文件,请重新输入"<>name;
flag=0;
for(j=0;j<5;j++){
if(strcmp(AFD[j].name,name)){//如果没有这个文件
flag=1;
}//break;
else{
flag=0;
strcpy(AFD[j].name,"0");//清空文件
AFD[j].code=0;
AFD[j].pwrite=0;
AFD[j].size=0;
cout<<"运行队列中的该文件己被关闭"<