您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 天津科技大学操作系统课程设计
2014-2015学年第一学期专业:软件工程班级:121031学号:121031姓名:提交日期:2015.1.7操作系统课程设计实验指导书操作系统课程设计【设计题目】Linux二级文件系统设计【设计目的】(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】为Linux系统设计一个简单的二级文件系统。要求做到以下几点:①可以实现下列几条命令:login用户登录dir列目录Attrib修改文件属性create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件cd进出目录②列目录时要列出文件名,物理地址,保护码和文件长度③源文件可以进行读写保护【开发语言及实现平台或实验环境】C++/VC++【相关知识综述】理解二级目录的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。【设计思路】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记1.主要的数据结构#defineMAXNAME25/*mfdname,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*/voidModifyFM();/*ModifyFileMode*/voidOpenF();/*OpenFile*/voidCloseF();/*CloseFile*/voidReadF();/*ReadFile*/voidWriteF();/*WriteFile*/voidQuitF();/*QuitFileSystem退出文件系统*/voidhelp();3.总体功能程序结构图(1)open():进入open()当前用户名和当前目录相同?NY请转到当前用户名目录下当前文件存在?(文件号0)输入要打开的文件名,并查找对应的文件号Y该文件不存在N确定当前用户的用户号该文件已经打开?NY该文件已经打开,不用再打开Y该文件可以被打开?(不是protect型的)Y该文件是protect的,不能打开打开文件NY返回主函数(2)close():进入close()当前用户名和当前目录相同?NY请转到当前用户名目录下当前文件存在?(文件号0)输入要关闭的文件名,并查找对应的文件号Y该文件不存在N确定当前用户的用户号该文件是关闭的?NY该文件未打开,不用关闭YY关闭文件返回主函数(3)write():进入write()当前用户名和当前目录相同?NY请转到当前用户名目录下有打开的文件?输入要写入的文件名,并查找对应的文件号无已经打开的文件提示必须先打开,并显示出已经打开的文件列表NY当前文件存在?(文件号0)该文件不存在NY该文件已经打开?该文件未打开,不能写NY该文件可以被写入?(是可写或读写模式)该文件是制度模式或保护模式NY(4)delete确定文件路径写入内容到文件中记录文件长度返回主函数进入delete()当前用户名和当前目录相同?NY请转到当前用户名目录下当前文件存在?(文件号0)输入要删除的文件名,并查找对应的文件号Y该文件不存在N确定当前用户的用户号该文件可以被删除?(不是protect型的)该文件是protect的,不能打开NYY该文件已经打开?该文件已经打开,不能删除YNY删除文件确定文件路径【源程序清单】voidOpenF(){charfname[MAXNAME];inti,k;if(strcmp(strupr(dirname),strupr(username))!=0){printf(\nError!Youcanonlyopenfileinyourselfdir.\n);}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.file\'%s\'hadbeenopened,itcannotbeopenedagain.\n,fname);}else删除的后面的文件向前移该用户的文件总数-1返回主函数把删除后的地址号置为未用{if((ufd[k]-ufdfile[i].fmode==0)||(ufd[k]-ufdfile[i].fmode==1)||(ufd[k]-ufdfile[i].fmode==2)){ifopen[k][i].ifopen=1;ifopen[k][i].openmode=(ufd[k]-ufdfile[i].fmode);printf(\'%s\'hasbeenopenedsuccessfully!,fname);}elseprintf(\n\'%s\'isaprotectedfile,itcannotbeopened.,fname);}}else{printf(\nError.\'%s\'dosenotexist.\n,fname);}}}voidCloseF(){charfname[MAXNAME];inti,k;if(strcmp(strupr(dirname),strupr(username))!=0){printf(\nError.Youcanonlymodifyfilemodeinyourselfdir.\n);}else{printf(\nPleaseinputFileName:);gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i=0){k=ExistD(username);if(ifopen[k][i].ifopen==0){printf(\nError.\'%s\'hasbeenclosed.youcannotcloseitagain.\n,fname);}else{ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf(\'%s\'hasbeenclosedsuccessfully!,fname);}}else{printf(\nError.\'%s\'dosenotexist.\n,fname);}}}voidDeleteF(){charfname[MAXNAME];inti,k,x;charstr[255],str1[255];if(strcmp(strupr(dirname),strupr(username))!=0){printf(\nError.Youcanonlydeletefileinyourselfdir.\n);}else{printf(\nPleaseinputFileName:);gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i=0){k=ExistD(username);if(ufd[k]-ufdfile[i].fmode==3){printf(\n\'%s\'isaprotectedfile,itcannotbedeleted.,fname);}else{if(ifopen[k][i].ifopen==1)printf(\n\'%s\'hasbeenopened,itcannotbedeleted.,fname);else{itoa(ufd[k]-ufdfile[i].fpaddr,str,10);strcpy(str1,file);strcat(str1,str);strcpy(str,c:\\osfile\\file\\);strcat(str,str1);x=_unlink(str);fpaddrno[ufd[k]-ufdfile[i].fpaddr]=0;for(i;i(fcount[k]-1);i++){ufd[k]-ufdfile[i]=ufd[k]-ufdfile[i+1];}fcount[k]--;printf(\'%s\'hasbeendeletedsuccessfully!,fname);}}}else{printf(\nError.\'%s\'dosenotexist.\n,fname);}}}voidWriteF(){charstr[50],str1[50];inti,k,n=0;intlength=0;charc;charfname[MAXNAME];char*rtrim(char*str);char*ltrim(char*str);intExistF(char*filename);intExistD(char*dirname);if(strcmp(strupr(ltrim(rtrim(dirname))),)==0){printf(\nError.Pleaseconverttoufddirbeforewrite.\n);return;}else{printf(\nCaution:Openfilefirst\n);printf(OpenedFile(s)List:\n);k=ExistD(dirname
本文标题:天津科技大学操作系统课程设计
链接地址:https://www.777doc.com/doc-3514398 .html