资源描述
操作系统(2014年秋季学期)序号:8 实 验 报 告系别:计算机科学与技术班级:信安12-1班姓名:李勇学号:07101020112实验名称:进程调度总成绩:评语: 日期:操作系统实验报告实验名称进程调度实验序号1实验日期2014.1.2实验人李勇一、实验目的、要求与环境1目的:编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。2.要求:(1)用C语言(或其它语言,如Java)实现一个简单的二级文件系统设计,加深对文件系统的内部功能和内部实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作, 实现用户的创建、查询、登录、删除,和文件的添加、删除、打开、关闭、读、写等基本命令,用在屏幕上输入命令来模拟用户程序中调用的文件操作。(2)为了清楚地观察文件的管理过程,程序应将每个文件操作的结果显示出来。(3)分析程序运行的结果,谈一下自己的收获。3.环境:1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C C+Java 等编程语言环境。二、相关背景知识最基本的文件操作 (1)创建文件 在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。 (2)删除文件 当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。 (3)读文件 在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。 (4)写文件 在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。 (5)截断文件 如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。 (6)设置文件的读/写位置 前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。 三、实验设计说明(写你实验相关的设计,别写这么少,多写点。)本次实验采用C语言模拟二级文件系统,可以在多用户环境下实现用户的创建、查询、登录、删除,和文件的添加、删除、打开、关闭、读、写等基本操作,很好地模拟了操作系统对文件的管理过程。四、实验设计的流程图(写你实验相关的设计流程图,下面的流图是有问题的。)选择操作命令及命令对象文件实施该命令输出错误信息显示已经完成操作的信息开始进行该用户的下个操做直到退出该用户权限结束有操作权限?是否要创建新文件?退出?输入文件名等信息;显示已经完成操作的信息YNYNNY选择用户四、程序代码(换上你自己的程序代码,下面的程序代码是有问题的。)#include stdlib.h#include #define NULL 0int count=0;struct filechar name10;int code;/保护码int size;char pwrite;/读写指针;struct userchar name10;struct file *list;/目录指针;/struct file one10=a1,0,10,0,a2,2,10,0,a3,1,10,0,a4,2,10,0,a5,2,10,0,a6,2,10,0,a7,1,10,0,0,0,0,0,0,0,0,0,0,0,0,0;struct file two10=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 three10=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,0,0,0,0,0,0,0,0;struct file four10=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 fine10=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 six10=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 seven10=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 eight10=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 nine10=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 ten10=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 UFD10;struct file AFD5=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/struct user use10=number1,one,number2,two,number3,three,number4,four,number5,fine,number6,six,number7,seven,number8,eight,number9,nine,number10,ten;struct user MFD1=0,0;/voidrunning();void delet(); voidwrite();voidopen();voidclose();voidbye();voidread();voidcreate();void input();/using namespace std;void main()input();running();cout操作己结束endl;/void running()char order;int i;coutendl*endl;cout用户的所有文件如下:endl;for(i=0;i10;i+)coutUFDi.namet;coutendl*endl;cout 请选择操作命令(输入代号):endl;coutc-create d-deleteo-opens-close r-read w-writeb-byet.exit(重选用户)endl;coutendl*endl;cout请输入命令:order;switch(order)case c : create();break;case d : delet();break;case o : open();break;case s : close();break;case r : read();break;case w : write();break;case b : bye();break;case t : input();break;default : cout输入命令出错,请重输endlendl;running();/void delet()char name10;int i,flag;docout请输入文件名:endlname;flag=0;for(i=0;i10;i+)if(strcmp(UFDi.name,name)/如果没有这个文件flag=1;/break;elseflag=0;strcpy(UFDi.name,0);/清空文件UFDi.code=0;UFDi.pwrite=0;UFDi.size=0;cout该文件己被删除endl;break;if(flag=1)cout无此文件,请重新输入endl;while(flag=1);coutendl;running();/void open()char name10;int i,j,flag;if(count=5)cout运行文件队列己满endl;running();elsedocout请输入文件名:name;flag=0;for(i=0;i10;i+)if(strcmp(UFDi.name,name)/如果没有这个文件flag=1;/break;elseflag=0;break;if(flag=1)cout无此文件,请重新输入endl;while(flag=1);for(j=0;j5;j+)if(strcmp(AFDj.name,name)/如果没有这个文件flag=1;elseflag=0;break;if(flag=1)for(j=0;j5;j+)if(!strcmp(AFDj.name,0)AFDj=UFDi;cout文件己打开endl;count+;break;else cout该文件己经在打开队列中endl;coutendl;running();/void close()char name10;int j,flag;cout请输入文件名:name;flag=0;for(j=0;j5;j+)if(strcmp(AFDj.name,name)/如果没有这个文件flag=1;/break;elseflag=0;strcpy(AFDj.name,0);/清空文件AFDj.code=0;AFDj.pwrite=0;AFDj.size=0;cout运行队列中的该文件己被关闭endl;break;if(flag=1)cout运行队列中无此打开的文件,请重新操作endl;coutendl;running();/void bye()int i,j;for(i=0;i5;i+)for(j=0;j10;j+)if(!strcmp(AFDi.name,UFDj.name)UFDi=AFDi;break;cout文件目录己保存endl;coutendl;/void read()char name10;int j,flag=0;cout请输入文件名:name;for(j=0;j5;j+)if(!strcmp(AFDj.name,name)/如果AFD有这个文件flag=1;break;if(flag=1)if(AFDj.code=0|AFDj.code=2)AFDj.pwrite=R;cout文件的状态是正在读endl;else cout无权限写此文件endl;else cout运行队列中无此文件,请先打开文件endl;coutendl;running();/ void write()char name10;int j,flag=0;cout请输入文件名:name;for(j=0;j5;j+)if(!strcmp(AFDj.name,name)/如果AFD有这个文件flag=1;break;if(flag=1)if(AFDj.code=1|AFDj.code=2)AFDj.pwrite=W;cout文件的状态是正在写endl;else cout无权限写此文件endl;else cout运行队列中无此文件,请先打开文件endl;coutendl;running();/void create()char name10;int i,j=0,flag;for(i=0;i9)cout文件夹己满,请先删除endl;/coutj;running();elsedocout请输入文件名:name;flag=0;for(i=0;i10;i+)if(!strcmp(UFDi.name,name)/如果有重名的文件cout文件名重复,请重新输入endl;flag=1;break;while(flag=1);for(i=0;i10;i+)if(!strcmp(UFDi.name,0)/找到第一个空的文件strcpy(UFDi.name,name);docout请输入保护码(选择-2,0-可读,-可写,-可读写):UFDi.code;if(UFDi.code!=0&UFDi.code!=1&UFDi.code!=2)cout输入错误,重新输入保护码endl;while(UFDi.code!=0&UFDi.code!=1&UFDi.code!=2);cout请输入文件长度(选择数字):UFDi.size;cout己建立文件UFDi.nameendl;break;running();/void input()char name;int i;coutendl*endl;cout 请选择以下用户名(输入数字):endl;cout1.one2.two3.three4.four5.fine6.six7.seven8.eigh9.nine0.tenendl;cout*endlendl;coutname;switch(name)case 1: for(i=0;i10;i+)UFDi=onei;MFD0=use1;running();break;case 2: for(i=0;i10;i+)UFDi=twoi;MFD0=use1;running();break;case 3: for(i=0;i10;i+)UFDi=threei;MFD0=use2;running();break;case 4: for(i=0;i10;i+)UFDi=fouri;MFD0=use3;running();break;case 5: for(i=0;i10;i+)UFDi=finei;MFD0=use4;running();break;case 6: for(i=0;i10;i+)UFDi=sixi;MFD0=use5;running();break;case 7: for(i=0;i10;i+)UFDi=seveni;MFD0=use6;running();break;case 8: for(i=0;i10;i+)UFDi=eighti;MFD0=use7;running();break;case 9: for(i=0;i10;i+)UFDi=ninei;MFD0=use8;running();break;case 0: for(i=0;i10;i+)UFDi=teni;MFD0=use9;running();break;default : cout输入用户名出错endl;input();五、编译过程截图(下面是一个例子,换上你自己的图)六、测试用例(下面是一个例子,换上你自己的)文字叙述一下测试过程的实例。如先创建用户*、再产生文件*、再打开文件*,再写入内容*,再退出,再打开用户*,再将文件读出,读出的内容应该是*。等等。六、实验结果(下面是一个例子,换上你自己的图,给出根据测试用例的截图)七、实验结果分析(写你实验相关的实验结果分析,别写这么少,多写点。)本实验通过一个简单的二级文件系统设计,加深了对文件系统的内部功能和内部实现的理解。模拟采用二级目录结构的磁盘文件系统的文件操作能实现添加,删除,打开,关闭等基本命令,用输入命令来模拟用户程序中调用的文件操作。八、实验的总结与收获 (写你们自己各自的总结与收获)123本次实验条理清晰,易于理解,程序编写完成后,实现了预期的结果。界面设计比较清晰明了,易于阅读。 本程序中灵活地设计调用函数和函数嵌套来简化程序,简化了代码。 另外,在编写程序之前,由于先画了流程图,对应流程图的顺序来实现程序,能对程序有个全局的把握,提高了编写速度,减少了错误。
展开阅读全文