您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Unix文件系统模拟
操作系统课程设计说明书题目:一个多用户多级目录结构文件系统设计与实现账户:user208密码:dryish20一、目的通过操作系统内其中一个子系统的设计和实现,掌握操作系统设计的方法与技巧,增强系统软件设计的实际工作能力。二、内容设计并实现一个多用户多级目录结构的文件系统。该系统必须具备下列功能:login用户登录logout用户退出init文件系统初始化目录操作md创建目录rd删除目录cd设置目录文件操作create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件dir列文件目录三、设计思想说明1设计环境课程设计的环境是Linux操作系统。设计时可利用Linux提供的文件管理的功能调用,建立一个模拟的文件系统。基本思想是,在Linux系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux系统的功能调用,l编写各程序模块。2、文件卷的组织以1M的内存空间作为文件空间,空间“分块”,编号为0#~(BLKMAX-1)#。“分块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。分块主要体现在文件卷的读/写模块上。#defineBSIZE512/*512bytes/块*/#defineBLKMAX2048/*共2048块*/0#块的作用:0#块是专用块(超级块)。前半部用于存放文件卷空间的位示图(bitmap),位状态='0'表示对应块空闲,状态='1'表示已分配。后半部的最后32个字节用于存放根目录的目录结构。0#块不参与文件空间的动态分配。1#~(BLKMAX-1)#块用于存放文件(普通文件和子目录文件)的信息。四、数据结构的设计(1)文件目录结构structdir{unsignedshortd-mode;/*文件属性及访问权限*/chard-uid;/*文件主标识*/chard-gid;/*文件主同组用户标识*/intd-fsize;/*文件大小(字节)*/chard-name[8];/*文件名*/intd-add[10];/*存放文件信息的空间地址(块号)*/}#defineDSIZE32/*以上目录结构占用32字节*/按以上述定义,每一块可存放16个目录结构。(2)文件控制块结构structfcb{charf-count;/*文件访问计数*/charf-flag;/*标志字*/intf-blkno;/*存放本文件目录结构的块号*/intf-number;/*文件目录结构所在块内偏移序号*/unsignedshortf-mode;/*文件属性*//*以下各项信息在文件打开时从structdir获取*/charf-uid;charf-gid;intf-fsize;charf-name[8];intf-add[10];}#defineFCBMAX16structfcbfcb[FCBMAX];/*系统fcb[]结构*/FCB标志字(f-flag)的各种标志定义为:#defineFUPD02/*本FCB代表的文件已修改*/#defineFCHG04/*本FCB结构中某些信息已被修改*/文件属性及文件访问权限(即d-mode和f-mode)定义:#defineIFMT0070000/*文件类型屏蔽字*/#defineIFDIR0010000/*子目录文件*/#defineIFREG0020000/*普通文件*/#defineIREAD0400/*文件主“读”权限*/#defineIWRITE0200/*文件主“写”权限*/#defineIEXEC0100/*文件主“执行”权限*/#defineGREAD040/*同组用户“读”权限*/#defineGWRITE020/*同组用户“写”权限*/#defineGEXEC010/*同组用户“执行”权限*/#defineOREAD04/*其它用户“读”权限*/#defineOWRITE02/*其它用户“写”权限*/#defineOEXEC01/*其它用户“执行”权限*/(3)打开文件结构structofile{charo-flag;/*标志字*/charo-count;/*访问计数*/structfcb*o-fcbp;/*对应打开文件FCB结构指针*/into-offset;/*文件当前读/写指针*/};#defineFILENO10/*文件系统允许打开文件数量*/structofileofile[FILENO];/*系统打开文件表ofile*/标志字o-flag表示的标志定义为:#defineFREAD01/*文件“读打开”标志*/#defineFWRITE02/*文件“写打开”标志*/(4)用户结构structuser{charu-name[12];/*用户名,登录时使用*/charu-uid;/*用户标识,即文件创建时的文件主*/charu-gid/*同组用户标识*/structfcb*u-cdir;/*现行工作目录的FCB指针*/charu-error;/*执行文件管理函数时返回的错误代码*/char*u-base;/*读/写文件时信息存储区始址*/intu-count;/*读/写文件的信息字节数*/intu-offset;/*读/写文件的相对位移量*/charu-obuf[8];/*文件路径名分量暂存区(查找文件时用)*/structfcb*u-pdir;/*新文件父目录FCB指针(文件创建时用)*/structofile*u-ofile[5];/*本用户打开文件表*/};#defineUSERNO5/*定义本文件系统最多可接纳五个用户*/structuseruser[USERNO];五、系统结构本文件系统采用层次结构,可以由低向高分成如下层次,并相应设置实现各层功能的函数。(1)块管理层(或称文件卷管理层),设下列主要函数:balloc()─块分配函数brelse()─块释放函数bread()─读一块函数bwrite()─写一块函数(2)FCB管理层。功能为涉及到FCB结构的操作,设下列主要函数:namei()─文件查找函数iget()─取目录结构函数(从文件中读出一指定的目录结构,建立相应FCB)iput()─存目录结构函数(将一指定FCB结构写回文件卷的目录结构位置内)readi()─对指定FCB代表的文件读函数(在命令解释层的fileread()中实现,未单独给出)writei()─对指定FCB代表的文件写函数(在命令解释层的writeread()中实现,未单独给出)(3)打开文件管理层。功能为涉及ofile结构的操作,设下列主要函数:openf()─为打开文件建立对应的ofile结构的函数closef()─为关闭文件建立对应的ofile结构的函数(4)命令解释层。功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。按系统的功能要求,可以设置一系列的函数,如fcreat()、fopen()、fread()、fwrite()和fclose()等。各层次内设的函数的关系:低层次的函数是高层次函数的基础,高层次函数要调用低层次的函数,以实现其功能。六、使用说明1.登录使用用户名:dengyu密码:f2.操作命令(1)dir[路径]当路径为空时,列出当前目录下的文件和文件夹当路径是以“/”开始时,列出当前目录开始,该路径目录下的文件和文件夹例如:dir/a/b当“/a/b”是正确的路径时,列出目录b下的文件和文件夹当“/a/b”错时,给出出错信息当路径不是“/”开始时,列出根目录开始,该路径目录下的文件和文件夹例如:dira/b当“a/b”是正确的路径时,列出目录b下的文件和文件夹当“a/b”错时,给出出错信息(2)md目录名用于在当前目录下创建一个新的文件夹目录名不能缺少(3)rd[目录名]用于删除整个目录,有两种用法:当“rd”命令后为空,即不带目录名时。将删除整个当前目录。例如:当前目录为FILE:\a命令rd+回车将会使整个当前目录清空,所有在FILE:\a中的文件和文件夹都将失去。目录a变成空目录。当“rd”命令后带目录名时。将删除该目录。例如:当前目录为FILE:如果使用命令“rda”,将删除目录a。注意:rd命令破坏性很大,一不小心就会将所指定目录下的所有树状结构全部删除,包括文件。所以,没有绝对的把握,不要随便使用rd,以免失去有用的文件数据。(4)cd目录名该命令用于进入指定的目录,后边的目录名不能缺。(5)cd.和cd..“cd.”用于退到上一个目录。“cd..”用于直接退到根目录。(6)open文件名打开当前目录下的文件。(7)close关闭所有打开的文件。(8)read文件名将该文件的内容读到文件输入输出缓冲区filebuffer,并打印出来该文件的数据。(9)write文件名该命令将文件缓冲区里的数据写入到另一个文件里边。本系统提供了几个文件操作的仿系统调用,列出如下:参数按顺序:fileread(char*,int,FILE*)缓冲区指针,读取数据的大小,文件指针filewrite(char*,int,FILE*)缓冲区指针,写入数据的大小,文件指针fileopen(char*,char*)文件名,打开方式fileclose(FILE*)文件指针在解释命令行命令,如“read文件名”,“write文件名”等等时,需要调用这些函数。在现有的文件卷buffer中,可以看到这些函数所起到的作用。进入模拟文件系统以后,首先用命令dir,可以看到一个文件f和一个文件夹k用命令cdk进入目录k,使k成为当前目录,可以看到k下有一个空目录l和一个空文件k.可以先openk,然后readk,会显示出k的内容回到根目录后,尝试将文件f复制给目录k下的文件k.用openf打开文件f,此时,文件缓冲区里有了f的数据。然后再次进入目录k,用命令openk打开里边的文件k,然后再用命令writek,这样,文件缓冲区里的数据写入了空文件k。用命令readk可以看到屏幕上打印出来k里的内容。此时,文件k里的内容已经不是空了,已经成功将文件f复制到文件k.附录#includestdio.h#includestring.h#defineBSIZE512/*512bytes/块*/#defineBLKMAX2048/*共2048块*/#defineBUFFER1048576/*1M*/#defineREADRIG1#defineWRITEERR1#defineFILES5structuser{charu_name[12];/*用户名,登录时使用*/charu_uid;/*用户标识,即文件创建时的文件主*/charu_gid;/*同组用户标识*/structfcb*u_cdir;/*现行工作目录的FCB指针*/charu_error;/*执行文件管理函数时返回的错误代码*/char*u_base;/*读/写文件时信息存储区始址*/intu_count;/*读/写文件的信息字节数*/intu_offset;/*读/写文件的相对位移量*/charu_obuf[8];/*文件路径名分量暂存区(查找文件时用)*/structfcb*u_pdir;/*新文件父目录FCB指针(文件创建时用)*/structofile*u_ofile[FILES];/*本用户打开文件表*/};#defineUSERNO5/*定义本文件系统最多可接纳五个用户*/structuseruser[USERNO],*u=newstructuser;#defineNOERROR-1#defineREADERR0#defineNOTFOUND1structofile{charo_flag;/*标志字*/charo_count;/*访问计数*/structfcb*o_fcbp;/*对应打开文件fcb结构指针*/into_offset;/*文件当前位置*/};#defineFILENO10/*文件系统允许打开文件数量*/structofileofile[FILENO];/*系统打开文件表ofile*///标志字
本文标题:Unix文件系统模拟
链接地址:https://www.777doc.com/doc-3368405 .html