logo资料库

操作系统实践报告二.doc

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
操作系统实验报告 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<<"运行队列中的该文件己被关闭"<
分享到:
收藏