专业:软件工程学号:14103232姓名:窦新月提交日期:2017.1.10操作系统课程设计报告操作系统课程设计报告1【设计目的】(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力……………………………………..【设计内容】一、任务为Linux系统设计一个简单的二级文件系统。要求做到以下几点:1.可以实现下列几条命令:login用户登录dir列目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件cd进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护二、程序设计1.设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。………………………………….【实验环境】C++/VC++【相关知识综述】对采用二级文件目录的文件系统工作的机理了如指掌,对文件系统的相关操作要掌握。理解二级目录的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。【设计思路】采用的数据结构、主要的函数说明、程序流程设计等操作系统课程设计报告2本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记1.主要的数据结构#defineMAXNAME25/*thelargestlengthofmfdname,ufdname,filename表示三种文件的长度都为25*/#defineMAXCHILD50/*thelargestchild每个用户下可以有50个文件*/#defineMAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno定义一个常量2500个扇区*/typedefstruct/*thestructureofOSFILE*/{intfpaddr;/*filephysicaladdress物理地址*/intflength;/*filelength文件长度*/intfmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/charfname[MAXNAME];/*filename文件名*/}OSFILE;typedefstruct/*thestructureofOSUFD*/{charufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;/*osf文件的数据结构*/typedefstruct/*thestructureofOSUFD'LOGIN*/{charufdname[MAXNAME];/*ufdname*/charufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode*/{intifopen;/*ifopen:0-close,1-open*/intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/}OSUFD_OPENMODE;2.主要函数voidLoginF();/*LOGINFileSystem*/voidDirF();/*DirFileSystem*/voidCdF();/*ChangeDir*/voidCreateF();/*CreateFile*/voidDeleteF();/*DeleteFile*/操作系统课程设计报告3voidModifyFM();/*ModifyFileMode*/voidOpenF();/*OpenFile*/voidCloseF();/*CloseFile*/voidReadF();/*ReadFile*/voidWriteF();/*WriteFile*/voidQuitF();/*QuitFileSystem退出文件系统*/voidhelp();3.总体功能程序结构图开始结束目录退出目录创建文件关闭文件打开文件删除文件选择操作登录注册账号读文件写文件操作系统课程设计报告4(1)打开命令的流程图(open)NYYNYYNNY开始是否为自己目录下的文件输出只能打开自己目录下文件输入打开的文件名并查找文件号当前文件是否存在文件号=0不存在确定用户号文件已打开?不再打开文件能打?开是protect文件打开文件结束操作系统课程设计报告5(2)删除命令的流程图(delete)YNNYNYNYYN开始目录名是否为空列表名为空,变为UFD列表输入删除的文件名并查找文件号当前文件是否存在文件号=0?不能删除确定用户号文件能否删除是protect文件文件已打开?不能删除确定文件路径删除文件该文件数-1结束是否为自己目录下的文件下的文件输出无法删除非自己目录下文件操作系统课程设计报告6(3)关闭命令的流程图(close)YNYYN开始是否为自己目录下的文件输出无法关闭非自己目录下文件输入关闭的文件名并查找文件号当前文件是否存在文件号=0文件不存在确定当前用户名该文件已关闭?该文件未打开,不用关闭关闭文件结束操作系统课程设计报告7(4)写入命令的流程图(write)NYNYNYYNYY12开始是否为自己目录下的文件输出无法关闭非自己目录下文件必须有打开的文件列表,有可读文件?无打开文件有打开的文件输入要写的文件名并查找文件号当前文件是否存在?不存在,不能写该文件是否打开?未打开不能写文件模式是否可被写入?模式不一样,不能写入确定文件路径做覆盖形式的写,记录长度结束做追加形式的写,记录长度选择追加or覆盖操作系统课程设计报告8【源程序清单】1.删除voidDeleteF()/*DeleteFile*/{charfname[MAXNAME],str[50],str1[50];inti,k,j;intfpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),)==0)/*列表名为空,变为UFD列表*/{printf(\nError.Pleaseconverttoufddirbeforedelete.\n);wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/{printf(\nError.Youcanonlymodifyfilemodeinyourselfdir.\n);wgetchar=1;}else{printf(\nPleaseinputFileName:);gets(fname);//从键盘获取所要删除的文件名ltrim(rtrim(fname));i=ExistF(fname);//获取文件编号if(i=0)操作系统课程设计报告9{k=ExistD(username);if(ifopen[k][i].ifopen==1)/*文件打开时无法删除*/{printf(\nError.\'%s\'isinopenstatus.Closeitbeforedelete.\n,fname);wgetchar=1;}else{if(ufd[k]-ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf(\nError.\'%s\'isinprotectstatus.Closeitbeforedelete.\n,fname);wgetchar=1;}else{fpaddrno1=ufd[k]-ufdfile[i].fpaddr;//获取文件对应的物理文件名fpaddrno[fpaddrno1]=0;//回收盘块for(j=i;jfcount[k];j++){ufd[k]-ufdfile[j]=ufd[k]-ufdfile[j+1];//从被删除的文件号开始,数组值全部前移一个}strcpy(str,d:\\osfile\\file\\file);操作系统课程设计报告10itoa(fpaddrno1,str1,10);//整数转化成字符串strcat(str,str1);strcat(str,.txt);remove(str);//删除物理文件fcount[k]--;//k用户文件数量少1printf(\n\'%s\'isdeletedsuccessfully.\n,fname);wgetchar=1;}}}else//所要删除的文件不存在{printf(\nError.\'%s\'dosenotexist.\n,fname);wgetchar=1;}}}2.打开文件voidOpenF()//打开文件{charfname[MAXNAME];inti,k;charopenmode[25];/*是否删除*/char*rtrim(char*str);/*移除尾部空格.*/char*ltrim(char*str);/*移除头部空格.*/intExistF(char*filename);/*FileName是否存在,Exist-i,NotExist-0*/操作系统课程设计报告11intExistD(char*dirname);if(strcmp(strupr(dirname),strupr(username))!=0)/*用户名和当前目录不同*/{printf(\nError.Youcanonlyopenfileinyourselfdir.\n);wgetchar=1;}else/*用户名和当前目录相同了*/{printf(\nPleaseinputFileName:);gets(fname);ltrim(rtrim(fname));i=ExistF(fname);/*文件是否存在并返回第几个文件号*/if(i=0)/*文件存在*/{k=ExistD(username);/*根据用户名确定用户号*/if(ifopen[k][i].ifopen==1)/*文件已打开*/{printf(\nError.\'%s\'isinopenstatus.Youdon'tneedtoopenit.\n,fname);wgetchar=1;}else{if((ufd[k]-ufdfile[i].fmode==0)||(ufd[k]-ufdfile[i].fmode==1)||(ufd[k]-ufdfile[i].fmode==2))//判断fmode{ifopen[k][i].ifopen=1;ifopen[k][i].openmode=(ufd[k]-ufdfile[i].fmode);printf(\n\'%s\'hasbeenopen.\n,fname);wgetchar=1;return;}else{printf(\n\'