模拟UNIX文件系统的设计及实现操作系统大作业
模拟UNIX文件系统的设计及实现操作系统大作业(含源文件)
华南理工大学“计算机操作系统”课程设计大作业(含答案)一、题目: 模拟UNIX文件系统的设计及实现多用户、多目录的文件系统的设计------用VC或Delphi编程模拟文件系统的管理二、目的通过OS文件子系统的设计、增强OS设计的技巧,达到提高解决实际OS的设计能力的提高。
三、内容多用户的多级目录的文件系统设计。
四、功能要求1. 多用户:usr1,usr2,usr3,……,usr8 (1-8个用户)2. 多级目录:可有多级子目录;3. 具有login (用户登录)4. 系统初始化(分配内存空间,创建文件卷,初始化根目录)5. 文件的创建:create6. 文件的打开:open7. 文件的读:read8.文件的写:write9. 文件关闭:close10. 删除文件:delete11. 创建目录(建立子目录):mkdir12. 改变当前目录:cd13. 列出文件目录:dir(包括文件属性)14. 删除目录:rmdir15. 退出:logout五、实现方法该大作业是实现一个类似unix的文件系统,只需要实现上述功能要求中所列出的功能,代码中不能调用OS系统提供的与文件操作和磁盘操作有关的系统调用。
设计提示:用内存模拟磁盘操作,对文件和目录的创建、删除、读写都用对内存的操作来模拟。
文件的属性信息用内存数据结构保存;所有文件内容和目录信息保存在内存中。
文件属性包括:文件名,所有者,创建时间,最后访问时间,文件大小,数据区指针或I-node指针等。
当程序运行结束时回收内存,信息不需要保存到磁盘,下次重新运行程序时重头开始。
六、实验要求每人完成一份大作业实验报告。
报告分设计思想、数据定义、处理流程、源程序、运行结果截图、设计体会等部分。
1)给出数据定义和详细说明;2)给出实现思想和设计流程;3)调试完成源程序;4)屏幕观察运行结果;5)总结自己的设计体会;编程语言及操作系统平台不限。
七、提交内容本大作业每个人必须单独完成。
操作系统课程设计通过模拟文件系统的实现
目录一、课程设计题目和目的 (1)二、课程设计要求 (1)三、程序设计思想 (1)四、文件系统的实现 (1)1.数据结构设计 (1)2.程序功能图 (2)3.实体关系图 (3)4.数据流图.................................................. 错误!未定义书签。
5.程序流程图 (3)(1) .建立文件:create(文件名,记录长度) (4)(2) .写文件:write(文件名,开始位置,字符串) (5)(3) .读文件:read(文件名,开始位置,长度) (6)(4) .显示文件所有内容 type(文件名) ....................... 错误!未定义书签。
(5) .删除文件delete(文件名) .............................. 错误!未定义书签。
(6) .重命名文件ren(文件名,新文件名) ..................... 错误!未定义书签。
(7) .查询文件属性ask(文件名) ............................. 错误!未定义书签。
(8) .关闭文件close(文件名) ............................... 错误!未定义书签。
五、程序运行结果及分析 (8)六、课程设计总结 (10)七、参考文献 (11)八、附录 (12)一、课程设计题目和目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二、课程设计要求通过组长分工,我主要完成了如下几个功能的操作:1.创建文件:从命令中得到文件名,得到该文件的文件长度,建立文件。
修改目录表。
4.读文件:read [文件名] [显示开始字节] [显示的字节数] ,直接显示所需要的字节数。
模拟文件系统的设计与实现
中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:xxx 学号:xxx设计题目:模拟文件系统的设计与实现起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx2016 年1月8日1需求分析通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
2总体设计结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
文件的创建: create 文件关闭:close 文件的打开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创建子目录:mkdir 删除子目录:rmdir列出文件目录:dir 退出:exit系统执行流程图3.详细设计 主要数据结构:#define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024//磁盘块数目1K#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT 表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1//根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct)//根目录大小#define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5//最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KBstruct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/};struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数、盘块数)*/int firstdisk; /*文件/目录起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/}directitem[MSD+2];};struct opentable{struct openttableitem{char name[9]; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/}openitem[MOFN];int cur_size; /*当前打文件的数目*/};管理文件的主要代码:int create(char *name){int i,j;if(strlen(name)>8) /*文件名大于 8位*/return(-1);for(j=2;j<MSD+2;j++) /*检查创建文件是否与已存在的文件重名*/ {if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2) /*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++) /*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN) /*打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空闲盘块 j 后退出*/ {if(fat[j].em_disk=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk = '1'; /*将空闲块置为已经分配*//*-----------填写目录项-----------------*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk = j;cur_dir->directitem[i].size = 0;cur_dir->directitem[i].next = j;cur_dir->directitem[i].property = '0';/*---------------------------------*/fd = open(name);return 0;}int open(char *name){int i, j;for(i=2;i<MSD+2;i++) /*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)return(-1);/*--------是文件还是目录-----------------------*/if(cur_dir->directitem[i].property=='1')return(-4);/*--------文件是否打开-----------------------*/ for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN) /*文件已经打开*/return(-2);if(u_opentable.cur_size>=MOFN) /*文件打开太多*/return(-3);/*--------查找一个空闲用户打开表项-----------------------*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;}/*--------------填写表项的相关信息------------------------*/u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size = cur_dir->directitem[i].size;u_opentable.cur_size++;/*----------返回用户打开表表项的序号--------------------------*/return(j);}int close(char *name){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*-----------清空该文件的用户打开表项的内容---------------------*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk = -1;u_opentable.openitem[i].size = 0;u_opentable.cur_size--;return 0;}int write(int fd, char *buf, int len){char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/ char Space = 32;char Endter= '\n';for(i=0;i<len;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = Endter;}/*----------读取用户打开表对应表项第一个盘块号-----------------------*/ item = u_opentable.openitem[fd].firstdisk;/*-------------找到当前目录所对应表项的序号-------------------------*/ for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*-存放当前目录项的下标-*//*------找到的item 是该文件的最后一块磁盘块-------------------*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*-----计算出该文件的最末地址-------*/first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len){strcpy(first,buf);u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; }else{for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];}/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);ilen2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen>0)ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE; k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k] =buf[k];}fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标志位为已分配-*/fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(int fd, char *buf){int len = u_opentable.openitem[fd].size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitem[fd].firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/for(i=0;i<ilen1;i++)if(i==ilen1-1) /*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];}else /*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];item = fat[item].item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;}}return 0;}int del(char *name){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*--查找要删除文件是否在当前目录中-*/ {if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/if(i>=MSD+2) /*--如果不在当前目录中-*/return(-1);if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/ return(-3);for(i=0;i<MOFN;i++) /*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/ while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0';item = temp;}/*-----------------释放目录项-----------------------*/cur_dir->directitem[cur_item].sign = 0;cur_dir->directitem[cur_item].firstdisk = -1;strcpy(u_opentable.openitem[cur_item].name,"");cur_dir->directitem[cur_item].next = -1;cur_dir->directitem[cur_item].property = '0';cur_dir->directitem[cur_item].size = 0;return 0;}主函数:int main(){FILE *fp;char ch;char a[100];char code[11][10];char name[10];int i,flag,r_size;char *contect;contect = (char *)malloc(MAX_WRITE*sizeof(char));if((fp=fopen("disk.dat","rb"))==NULL){printf("You have not format,Do you want format?(y/n)");scanf("%c",&ch);if(ch=='y'){initfile();printf("Successfully format! \n");}else{return 0;}}enter();print();show();strcpy(code[0],"exit");strcpy(code[1],"create"); strcpy(code[2],"open");strcpy(code[3],"close"); strcpy(code[4],"write"); strcpy(code[5],"read");strcpy(code[6],"del");strcpy(code[7],"mkdir"); strcpy(code[8],"rmdir"); strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){scanf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a))break;}switch(i){case 0: //退出文件系统free(contect);halt();return 0;case 1: //创建文件scanf("%s",name);flag = create(name);if(flag==-1){printf("Error: \n The length is too long !\n");}else if(flag==-2){printf("Error: \n The direct item is already full !\n");}else if(flag==-3){printf("Error: \n The number of openfile is too much !\n");}else if(flag==-4){printf("Error: \n The name is already in the direct !\n");}else if(flag==-5){printf("Error: \n The disk space is full!\n");}else{printf("Successfully create a file! \n");}show();break;case 2://打开文件scanf("%s",name);fd = open(name);if(fd == -1){printf("Error: \n The open file not exit! \n");}else if(fd == -2){printf("Error: \n The file have already opened! \n");}else if(fd == -3){printf("Error: \n The number of open file is too much! \n");}else if(fd == -4){printf("Error: \n It is a direct,can not open for read or write! \n");}else{printf("Successfully opened! \n");}show();break;case 3://关闭文件scanf("%s",name);flag = close(name);if(flag == -1){printf("Error:\n The file is not opened ! \n");}else{printf("Successfully closed! \n");}show();break;case 4://写文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{printf("Please input the file contect:");scanf("%s",contect);flag=write(fd,contect,strlen(contect));if(flag == 0){printf("Successfully write! \n");}else{printf("Error:\n The disk size is not enough! \n");}}show();break;case 5://读文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{flag = read(fd,contect);if(flag == 0){for(i=0;i<u_opentable.openitem[fd].size;i++){printf("%c",contect[i]);}printf("\t\n");}}show();break;case 6://删除文件scanf("%s",name);flag = del(name);if(flag == -1){printf("Error:\n The file not exit! \n");}else if(flag == -2){printf("Error:\n The file is opened,please first close it ! \n");}else if(flag == -3){printf("Error:\n The delete is not file ! \n");}else{printf("Successfully delete! \n");}show();break;}}}程序运行截图:.4.心得体会在设计的过程中,我查询了不少相关资料,不断地发现问题、提出问题、解决问题。
操作系统课程设计--基于Linux的模拟文件系统的设计与实现
简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。
这个系统是由世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。
用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。
可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。
这对Windows NT、Windows98、MS-DOS或OS/2等商品化操作系统来说是无法做到的。
Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。
其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。
在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络治理工具可构建NAT及功能全面的防火墙。
Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
Linux 操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
1需求分析 (2)1.1 功能介绍 (2)1.2 目的及意义 (4)1.2.1 目的 (4)1.2.2 意义 (5)1.3 设计成果 (6)2总体设计 (7)2.1功能介绍 (7)2.2模块关联 (8)3详细设计 (11)3.1用户结构 (11)3.2数据结构说明 (11)3.3主要功能的关键代码 (12)4测试及运行结果 (17)4.1 测试定义 (17)4.2 测试目的 (17)4.3 测试结果 (18)4.3.1 文件测试 (18)5心得 (40)1需求分析1.1 功能介绍基于Linux的模拟文件系统的设计与实现完成以下功能:(1)创建用户:手动的创建10个用户,都在界面上完成,输入用户名;每个用户最多可以保存10个文件。
操作系统课程设计-文件系统的模拟设计
操作系统课程设计报告题目:文件系统的模拟设计一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容(1)概述为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护(2)设计原理和系统总体功能框架图1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、对文件或目录的操作采用windows系统的API函数来实现。
6、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。
功能结构图如图1.0所示:(3)详细设计及少数重要编码的说明这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。
①、显示列表函数和目录流程图如图1.1所示②、文件创建函数算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
基于Linux的模拟文件系统的设计与实现
中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:学号:设计题目:基于Linux的模拟文件系统的设计与实现起迄日期:指导教师:前言简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。
这个系统是由世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。
用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。
可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。
这对Windows NT、Windows98、MS-DOS或OS/2等商品化操作系统来说是无法做到的。
Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。
其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。
在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络治理工具可构建NAT及功能全面的防火墙。
Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
Linux 操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
目录1需求分析 (3)1.1 功能介绍 (3)1.2 目的及意义 (5)1.2.1 目的 (5)1.2.2 意义 (6)1.3 设计成果 (7)2总体设计 (8)2.1功能介绍 (8)2.2模块关联 (9)3详细设计 (12)3.1用户结构 (12)3.2数据结构说明 (12)3.3主要功能的关键代码 (13)4测试及运行结果 (18)4.1 测试定义 (18)4.2 测试目的 (18)4.3 测试结果 (19)4.3.1 文件测试 (19)5心得 (41)1需求分析1.1 功能介绍基于Linux的模拟文件系统的设计与实现完成以下功能:(1)创建用户:手动的创建10个用户,都在界面上完成,输入用户名;每个用户最多可以保存10个文件。
模拟文件系统的设计与实现
删除文件:delete创建子目录:mkdir删除子目录:rmdir
列出文件目录:dir退出:exit
系统执行流程图
3.详细设计
主要数据结构:
#define MEM_D_SIZE 1024*1024 ame,name))
break;
}
if(j<MSD+2) /*文件已经存在*/
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
2总体设计
结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
文件的创建:create文件关闭:close文件的打开:open
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk = j;
cur_dir->directitem[i].size = 0;
cur_dir->directitem[i].next = j;
cur_dir->directitem[i].property = '0';
char Space = 32;
char Endter= '\n';
for(i=0;i<len;i++)
{
if(buf[i] == '$')
buf[i] = Space;
else if(buf[i] == '#')
buf[i] = Endter;
模拟一个小型类UNIX文件系统
题目一:模拟一个小型类UNIX文件系统一.设计思想说明小型类UNIX文件系统是模拟UNIX中的文件系统,实现文件系统中一些基本的功能,即关于目录及文件的相关操作。
首先为这个文件系统申请1M的内存空间存放文件系统的空间结构。
编写的这个程序并不是通过读取文件获取信息的,故在程序结束之后先前修改过的数据并不保存。
空间结构包括引导块,专用块,i节点区,文件存储区,进程对换区。
由于课程设计的要求,对引导块和进程对换区不做要求,故在实现这个系统的过程中并没有对引导块和进程对换区进行设计。
专用块用来存放空闲块和i节点的资源管理表;i节点区用来存放i节点,包括文件的文件名,属性,占用内存大小,物理地址等信息;文件存储区用来存放文件的具体内容。
对于文件的打开,读,写,关闭等操作,程序设计了用户打开文件表和系统打开文件表以及内存活动i节点,为了更好地管理文件而设计的这两个表。
用户打开文件表使用一个结构体表示,它的指针指向对应的系统打开表的各项。
系统打开文件表同样使用一个结构体表示,它的指针指向内存活动i节点,共享计数等,简化以后留下内存活动i节点。
内存活动i节点是真正指向文件的具体内容,从而可以实现对文件的修改。
除了对文件进行的相关操作外,这个模拟系统还对目录进行了相关操作,系统使用树型目录结构,,故使用一个结构体表示,有目录的名字,父节点,子节点的主码,以及一些基本信息。
磁盘i节点的结构使指针指向文件的具体内容。
二.相关数据结构的说明1.描述用户的数据结构struct User //定义了一个用户,另外一个空间为新注册的用户使用{char username[15]; //用户名char passwd[15]; //用户密码};struct User user[2];2.描述目录的数据结构struct catalogue //存储目录的结构体{char cataname[15]; //目录名int fathernum; //该目录的父节点int maxnum; //该目录最多可以拥有的子节点的个数int next[N]; //分别指向子节点};struct catalogue Catalogue[M];struct direntry //文件的目录索引项{char filename[20]; //文件名struct direntry *before,*after; //它的前向指针和后向指针struct inode *filepointer; //指向i节点的指针char mode; //该文件所处的状态};struct direntry *d_head;struct direntry *d_curr;4.描述i节点的数据结构struct inode //i节点定义{struct inode *before,*after; //前向指针和后向指针int blocknum[5]; //存放文件的物理地址,该文件最大为5KB int uid; //创建该文件的用户主码int catnum; //文件所处目录的编码int sizenum; //文件所占内存块的大小int location; //文件所处位置};struct inode *i_head;struct inode *i_curr;5.描述系统打开表的数据结构struct listos //系统打开表{struct direntry *list_os; //指向文件的目录项struct listos *after,*before; //前向指针和后向指针};struct listos *lo_head;struct listos *lo_curr;6.描述用户打开表的数据结构struct listfile //文件打开表{struct listfile *before,*after; //前向指针和后向指针struct listos *list_file; //指向系统打开表项};struct listfile *lf_head;struct listfile *lf_curr;struct memory //内存活动i节点{struct inode *mem; //指向文件目录项struct memory *after; //后向指针};struct memory *memhead;8.关于一些全局变量的定义#define N 10 //每个目录最多拥有N个子目录#define M 30 //最多可拥有M个目录int I; //记录当前目录指针的位置int Inum; //记录当前已经拥有的目录数目int ID=0; //用户编号char choose[15]; //暂时存放操作指令int bitmap[1024]; //存放位示图char content[10000]; //暂时存放即将要写入文件的内容int FREENUM; //存放位示图为0的块号的开始char INODE[1024][1024]; //1M空间存放内容三.各模块的算法流程图说明1.用户登录模块的算法流程图开始登录L/l 其它选择L/R进入到操作模块输入用户名新密码和确认密码是否新密码和确认密码相等2.操作模块的算法流程图3.更改当前目录的算法流程图开始cd更改当前目录mkdir创建子目录dir列出目录下的文件open打开文件read读文件写文件write删除文件delete关闭文件close退出系统logout开始cd输入想找的目录在目录链表中是更改当前目录,修改全局变量否返回到操作模块去4. 创建子目录的算法流程图5. 列出目录中文件的相关信息的算法流程图开始mkdir输入想创建的目录名在目录链表中有重名是更改当前目录,修改全局变量,将新的目录建立在原来的目录下的否返回到操作模块去6. 创建文件的算法流程图7. 打开文件的算法流程图开始create输入要创建的文件名在文件目录索引链表中是将新的文件存放在文件目录索引表中,并设置相关信息否返回到操作模块去开始dir输入想找的目录在目录链表中是显示目录下的文件的信息,修改目录的全局变量否返回到操作模块去8.写文件的算法流程图开始write输入要进行写操作的文件名在系统打开文件链表中&&当前用户创立是对该文件进行写操作,并设置相关信息否命令无效,返回到操作模块去开始open输入要打开的文件名是该文件已经打开,不必再次打开否在文件目录索引表中是将该文件插入到系统打开文件表中否想要操作的文件不存在在系统打开文件链表中&&当前用户创立9.读文件的算法流程图10.关闭文件的算法流程图开始read输入要进行读操作的文件名在系统打开文件链表中&&当前用户创立是对该文件的内容输出以方便用户进行阅览否命令无效,返回到操作模块去开始close输入要关闭的文件名在系统打开文件链表中&&当前用户创立是将文件的节点从系统打开文件表中删除否命令无效,返回到操作模块去11.删除文件的算法流程图四. 程序清单详见程序五. 使用说明书在运行程序之后,进入到模拟UNIX 系统中,首先出现的提示是:用户登录还是要注册:L/l 表示用户要登录,初始化的用户名:user1,密码:123;R/r 表示要进行注册,在注册时要注意,输入的新密码和确认密码必须一致,否则程序将不进行这样的注册,在注册之后,程序自动为该用户登录。
操作系统----模拟UNIX文件系统的设计及实现
/*TYPE UnixFileSysSim.cpp* 版权信息** 文件名称:UnixFileSysSim.cpp* 摘要:模拟实现UNIX的文件系统*****/#include "UnixFileSysSim.h"/** 函数介绍:寻找第一个空白的文件块ID* 输入参数:无* 输出参数:无* 返回值:返回第一个空白块的ID*/unsigned FindBlankFileBlockId(){unsigned char c;for (unsigned i = 0; i < FS.bm.BitMapLen / 8; i++){c = FS.bm.BMStart[i] | 0x7F;if (c == 0x7F){return i * 8; //一个字节左边第一位为0,表示该区域未使用}c = FS.bm.BMStart[i] | 0xBF;if (c == 0xBF){return i * 8 + 1;}c = FS.bm.BMStart[i] | 0xDF;if (c == 0xDF){return i * 8 + 2;}c = FS.bm.BMStart[i] | 0xEF;if (c == 0xEF){return i * 8 + 3;}c = FS.bm.BMStart[i] | 0xF7;if (c == 0xF7){return i * 8 + 4;}c = FS.bm.BMStart[i] | 0xFB;if (c == 0xFB){return i * 8 + 5;}c = FS.bm.BMStart[i] | 0xFD;if (c == 0xFD){return i * 8 + 6;}c = FS.bm.BMStart[i] | 0xFE;if (c == 0xFE){return i * 8 + 7;}}return FILEBLOCKCOU + 1;}/** 函数介绍:寻找第一个文件块地址* 输入参数:fileblockid 文件块ID* 输出参数:无* 返回值:返回文件块的地址*/char * FindBlankFileBlock(unsigned fileblockid) {FileBlock *fblock = FS.head;while (fblock->next != NULL){if (fblock->FileBlockId == fileblockid){return fblock->FileBlockAddr;}else{fblock = fblock->next;}}return NULL;}/** 函数介绍:得到当前时间的字符串* 输入参数:时间字符串的指针* 输出参数:无* 返回值:void*/void GetCurrentTime(char *currtime){char dbuffer [9];char tbuffer [9];_strdate(dbuffer);_strtime(tbuffer);strcpy(currtime, dbuffer);strcat(currtime, " ");strcat(currtime, tbuffer);}/** 函数介绍:更新文件索引* 输入参数:fileblockid 文件块ID* 输出参数:无* 返回值:无*/void AddFileIndex(unsigned fileblockid, unsigned filelevel, char *filename, char *parentname){FS.FI.FIStart[FS.FI.FICount].FileBlockId = fileblockid;FS.FI.FIStart[FS.FI.FICount].FileLevel = filelevel;strcpy(FS.FI.FIStart[FS.FI.FICount].FileName, filename);if (parentname == NULL){memset(FS.FI.FIStart[FS.FI.FICount].ParentName, '\0', MAXFILENAMELEN);}else{strcpy(FS.FI.FIStart[FS.FI.FICount].ParentName, parentname);}FS.FI.FIStart[FS.FI.FICount].Index = FS.FI.FICount;FS.FI.FIStart[FS.FI.FICount].effect = 1;FS.FI.FICount ++;}/** 函数介绍:更新位示图* 输入参数:fileblockid 文件块ID* 输出参数:无* 返回值:无*/void UpdateBitMap(unsigned fileblockid){//计复所在位示图的位置int dirInBitmap = ((int)(fileblockid / 8));int dirInChar = fileblockid % 8;char *c = &(FS.bm.BMStart[dirInBitmap]);char xor;switch (dirInChar){case 0:xor = 0x80;break;case 1:xor = 0x40;break;case 2:xor = 0x20;break;case 3:xor = 0x10;break;case 4:xor = 0x08;break;case 5:xor = 0x04;break;case 6:xor = 0x02;break;case 7:xor = 0x01;break;}*c = *c ^ xor;}/** 函数介绍:创建一个文件元素* 输入参数:acc 文件元素可操作权限,filename 文件元素名称,type 文件元素类型,filecontent 文件内容* 输出参数:无* 返回值:返回一个文件元素的指针*/FSElement * CreateFileElement(FEAccess acc, char *filename, FEType type, char *filecontent, FSElement *parent){//查找第一个空白文件块IDunsigned blankFileBlockId = FindBlankFileBlockId();if (blankFileBlockId >= FILEBLOCKCOU){printf("未找到一个文件块的id\n");return NULL;}//查找第一个空白块的地址char *blank = FindBlankFileBlock(blankFileBlockId);if (blank == NULL){printf("未找到一个文件块的地址\n");return NULL;}FSElement *fs = (FSElement *)blank;fs->Access = acc;fs->Creator = CS.CurrentUser;GetCurrentTime(fs->CreateTime);fs->FileBlockId = blankFileBlockId;fs->FileLevel = CS.FileLevel;strcpy(fs->FileName, filename);strcpy(fs->LastModTime, fs->CreateTime);fs->Type = type;fs->parent = parent;if (type == dir)fs->FileElemLen = sizeof(FSElement);fs->FileData = NULL;}else{fs->FileElemLen = (unsigned)strlen(filename);fs->fileStu = closed;fs->FileData = (char *)fs + sizeof(FSElement);if (filecontent == NULL){}else{strcpy(fs->FileData, filecontent);}}//更新索引if (parent == NULL){AddFileIndex(blankFileBlockId, CS.FileLevel, filename, NULL);}else{AddFileIndex(blankFileBlockId, CS.FileLevel, filename, parent->FileName);}//更新BITMAPUpdateBitMap(blankFileBlockId);return fs;}/** 函数介绍:创建文件块链表* 输入参数:datahead 第一块数据的地址,blockcap 一个文件块的大小,len 链表的长度* 输出参数:无* 返回值:返回链表的头指针*/FileBlock * CreateFileBlockList(char *datahead, unsigned blockcap, unsigned len) {if (datahead == NULL || len == 0){return NULL;FileBlock *head;FileBlock *pnew;FileBlock *pold;head = pold = pnew = (FileBlock *)malloc(sizeof(FileBlock));for ( unsigned i = 0; i < len; i++){pold->FileBlockId = i;pold->FileBlockCap = FILEBLOCKCAP;pold->FileBlockAddr = datahead + i * blockcap;memset(pold->FileBlockAddr, '\0', blockcap);if (i != len - 1){pnew = (FileBlock *)malloc(sizeof(FileBlock));}else{pnew = NULL;}pold->next = pnew;pold = pnew;}return head;}/** 函数介绍:初始化模拟文件系统* 输入参数:无* 输出参数:无* 返回值:true-初始化成功,false-初始化失败*/bool InitFileSys(){//初始化模拟的文件系统if ((FS.FSStart = (char *)malloc(FILESYSCAP)) == NULL){return false;}FS.FileSystemCap = FILESYSCAP;FS.bm.BitMapLen = BITMAPLEN;FS.bm.BMStart = FS.FSStart;//设置位示图为未使用memset(FS.bm.BMStart, '\0', FS.bm.BitMapLen);//初始化文件系统索引FS.FI.FIStart = (FileIndexElement *)(FS.FSStart + BITMAPLEN);//因为是模拟系统,暂定一个文件或文件夹最多占用一个文件块,一个文件块只放一个文件元素FS.FI.FILen = sizeof(FileIndexElement) * FILEBLOCKCOU + sizeof(unsigned) * 2;FS.FI.FICount = 0;memset(FS.FI.FIStart, '\0', FS.FI.FILen);//初始化文件块FS.FileBlockCou = FILEBLOCKCOU;FS.head = CreateFileBlockList((FS.FSStart + FILESYSCAP - FILEBLOCKCAP * FILEBLOCKCOU),FILEBLOCKCAP, FS.FileBlockCou);//区域的后FILEBLOCKCAP * FILEBLOCKCOU 个单元用来存储数据if (FS.head == NULL){return false;}//初始化系统当前状态erName = (char *)calloc(10,sizeof(char));strcpy(erName, "man");CS.CurrentUser.ut = admin;CS.CurrParent = NULL;CS.FileLevel = 0;CS.CurrentPath = (char *)calloc(1000, sizeof(char));//创建一个根目录base = CreateFileElement(pub, "root", dir, NULL, NULL);if (base == NULL){return false;}else{return true;}/** 函数介绍:系统登录模块* 输入参数:无* 输出参数:无* 返回值:true 登录成功,false 登录失败*/bool Login(){char username[10];char password[MAXPASSWORDLEN];int c;for (c = 0; c < USERTESTLOGINCOU; c++){int i = 0;memset(password, '\0', MAXPASSWORDLEN);memset(username, '\0', 10);printf("login:");gets(username);printf("password:");while (i < MAXPASSWORDLEN && (password[i++] = getch()) != 0x0d) {};password[strlen(password) - 1] = '\0';printf("\nuser name : %s \npassword:%s\n", username, password);if ((strcmp(username, "user1") == 0 && strcmp(password, "user1") == 0) || (strcmp(username, "user2") == 0 && strcmp(password, "user2") == 0) ||(strcmp(username, "user3") == 0 && strcmp(password, "user3") == 0) ||(strcmp(username, "user4") == 0 && strcmp(password, "user4") == 0) ||(strcmp(username, "user5") == 0 && strcmp(password, "user5") == 0) ||(strcmp(username, "user6") == 0 && strcmp(password, "user6") == 0) ||(strcmp(username, "user7") == 0 && strcmp(password, "user7") == 0) ||(strcmp(username, "user8") == 0 && strcmp(password, "user8") == 0) ||(strcmp(username, "super") == 0 && strcmp(password, "super") == 0)) {if (strcmp(username, "super") == 0) // 一个管理员{strcpy(erName, username);CS.CurrentUser.ut = admin;}else{//memset(erName, '\0', 10);strcpy(erName, username);CS.CurrentUser.ut = comm;}CS.FileLevel++;CS.CurrParent = base;strcpy(CS.CurrentPath, "\\");printf("\n欢迎使用模拟UNIX文件系统。
模拟UNIX(linux)文件系统
操作系统课程设计学院:信息科学与工程学院专业:班级:学号:学生姓名:指导教师:2009 年 4 月18 日一、实验内容1、题目:模拟UNIX(linux)文件系统[问题描述]在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。
二、概要设计在现有机器硬盘上开辟20M的硬盘空间(利用一个循环操作,在Disk中写入20M 的零,创建一个20M的文件即是),作为设定的硬盘空间。
磁盘块物理模型如下文件则是指具有文件名的若干相关元素的集合。
文件属性主要如下文件名:实现了按名存取,文件名和目录文件允许重名。
文件类型:可以从不同的角度来规定文件的类型。
普通文件、管道文件、块文件。
文件长度:指文件的当前长度,长度的单位可以是KB。
文件的物理位置:文件在磁盘中物理的存储,并打印出来。
此次UNIX文件系统最简单的目录结构。
整个文件系统中只建立一张目录表,每个文件一个目录项,目录项含有文件相关信息。
每建立一个新文件要先检索所有的目录项保证文件名唯一。
然后找出一空白目录项填入相关信息,并修改状态位。
删除文件是找到对应目录项,回收所占用空间,清除该目录。
逻辑结构如下Unix文件系统当文件很多时,文件目录要占用大量的盘块。
在查找目录的过程中,可能需要多次启动磁盘读入目录文件的盘块。
在检索目录文件中只用到了文件名,显然,文件的物理地址等文件的描述信息在检索目录时不需调入内存。
为此,可以把文件名与文件描述信息分开。
使文件描述信息单独形成一个索引结点。
把文件描述信息单独形成一个称为索引结点的数据结构,简称为inode;文件目录中的每个目录项,则仅由文件名及指向该文件所对应的inode的指针所构成。
这样,为找到一个文件的平均启动磁盘的次数减少很多模型如下:存储空间的分配与回收成组链接法首先,建立操作系统课程的设计模型。
这个系统将利用一个20M的文件作为自己的磁盘空间,设计时由于一个盘块占用1KB,所以20M空间可以产生20480个盘块系统本身将0# - 30#块作为系统区,所以用户区便剩下20450个盘块,每50个盘块为一组,一共可以分为409个组。
模拟UNIX文件系统的设计及实现操作系统大作业(含源文件)
模拟UNIX文件系统的设计及实现操作系统大作业(含源文件)案场各岗位服务流程销售大厅服务岗:1、销售大厅服务岗岗位职责:1)为来访客户提供全程的休息区域及饮品;2)保持销售区域台面整洁;3)及时补足销售大厅物资,如糖果或杂志等;4)收集客户意见、建议及现场问题点;2、销售大厅服务岗工作及服务流程阶段工作及服务流程班前阶段1)自检仪容仪表以饱满的精神面貌进入工作区域2)检查使用工具及销售大厅物资情况,异常情况及时登记并报告上级。
班中工作程序服务流程行为规范迎接指引递阅资料上饮品(糕点)添加茶水工作1)眼神关注客人,当客人距3米距离侯客迎询问客户送客户要求注意事项时,应主动跨出自己的位置迎宾,然后15度鞠躬微笑问候:“您好!欢迎光临!”2)在客人前方1-2米距离领位,指引请客人向休息区,在客人入座后问客人对座位是否满意:“您好!请问坐这儿可以吗?”得到同意后为客人拉椅入座“好的,请入座!”3)若客人无置业顾问陪同,可询问:请问您有专属的置业顾问吗?,为客人取阅项目资料,并礼貌的告知请客人稍等,置业顾问会很快过来介绍,同时请置业顾问关注该客人;4)问候的起始语应为“先生-小姐-女士早上好,这里是XX销售中心,这边请”5)问候时间段为8:30-11:30 早上好11:30-14:30 中午好 14:30-18:00下午好6)关注客人物品,如物品较多,则主动询问是否需要帮助(如拾到物品须两名人员在场方能打开,提示客人注意贵重物品);7)在满座位的情况下,须先向客人致歉,在请其到沙盘区进行观摩稍作等待;阶段工作及服务流程班中工作程序工作要求注意事项饮料(糕点服务)1)在所有饮料(糕点)服务中必须使用托盘;2)所有饮料服务均已“对不起,打扰一下,请问您需要什么饮品”为起始;3)服务方向:从客人的右面服务;4)当客人的饮料杯中只剩三分之一时,必须询问客人是否需要再添一杯,在二次服务中特别注意瓶口绝对不可以与客人使用的杯子接触;5)在客人再次需要饮料时必须更换杯子;下班程序1)检查使用的工具及销售案场物资情况,异常情况及时记录并报告上级领导;2)填写物资领用申请表并整理客户意见;3)参加班后总结会;4)积极配合销售人员的接待工作,如果下班时间已经到,必须待客人离开后下班;1.3.3.3吧台服务岗1.3.3.3.1吧台服务岗岗位职责1)为来访的客人提供全程的休息及饮品服务;2)保持吧台区域的整洁;3)饮品使用的器皿必须消毒;4)及时补充吧台物资;5)收集客户意见、建议及问题点;1.3.3.3.2吧台服务岗工作及流程阶段工作及服务流程班前阶段1)自检仪容仪表以饱满的精神面貌进入工作区域2)检查使用工具及销售大厅物资情况,异常情况及时登记并报告上级。
模拟Unix文件系统的设计与实现
模拟Unix文件系统的设计与实现
王浩亮
【期刊名称】《电脑知识与技术》
【年(卷),期】2006(000)012
【摘要】本文以c语言为开发工具结合UNIX文件系统,探讨了多用户多目录文件系统的设计与实现.
【总页数】2页(P184-185)
【作者】王浩亮
【作者单位】广东松山职业技术学院计算机系,广东,韶关,512126
【正文语种】中文
【中图分类】TP312
【相关文献】
1.模拟UNIX文件系统的设计及实现 [J], 吴志攀;杜华英
2.模拟Linux文件系统的设计与实现 [J], 周建涛;黄正鹏;李翔;聂玥;叶阳;韦俊宏
3.Unix文件系统安全管理的研究 [J], 林小平;唐露新
4.类Unix文件系统中TOCTTOU缺陷的静态分析方法 [J], 韩伟;贺也平
5.图示法在“模拟UNIX文件系统”大型实验中的应用 [J], 陆亿红;李波
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟UNIX文件系统的设计及实现操作系统大作业
UNIX文件系统是一种常见的操作系统文件系统,它提供了一种以层
次结构组织文件和目录的方式来管理存储设备上的数据。
为了完成这个大
作业,我们需要设计并实现一个简化版的UNIX文件系统,包括文件和目
录的管理、文件的读写操作、文件权限的管理等。
首先,我们需要设计文件系统的存储结构。
文件系统可以在硬盘上以
一个分区的形式存在,我们可以使用一个整数数组来表示硬盘,每个数组
元素表示硬盘上的一个块。
我们还可以使用一个超级块来记录文件系统的
信息,例如文件系统的状态、块的总数、块的使用情况等。
此外,我们还
需要设计并实现一个索引节点表,用于保存文件或目录的元数据信息,例
如文件的大小、权限、创建时间等。
接下来,我们需要实现文件和目录的管理功能。
文件和目录可以通过
其在索引节点表中的索引来标识。
我们可以使用一个数组来表示目录,数
组的每个元素都是一个目录项,记录了文件或子目录的名字和索引节点的
索引。
我们还可以使用一个栈来保存当前目录的路径,方便用户在不同目
录之间切换。
为了支持目录的嵌套,我们可以在目录项中添加一个指向父
目录的索引。
在文件和目录的管理基础上,我们还需要实现文件的读写操作。
文件
可以通过其索引节点的索引来标识。
当用户要读取文件时,我们需要根据
文件的索引节点找到文件的块地址列表,然后将列表中的块读取到内存中。
当用户要写入文件时,我们需要找到文件的块地址列表中最后一个块,如
果该块已满,则需要申请一个新的块,并将新块的地址添加到块地址列表中。
同时,我们还需要更新文件的大小和修改时间等元数据信息。
最后,我们还需要实现文件权限的管理功能。
文件的权限信息可以通
过文件的索引节点来保存。
我们可以使用一个整数来表示文件的权限,例
如八进制数,每一位代表一个权限,例如读取权限、写入权限和执行权限等。
当用户要访问文件时,我们需要根据用户的权限和文件的权限来判断
用户是否具有相应的权限。
总结起来,要完成这个大作业,我们需要设计并实现一个模拟UNIX
文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
通过实现这些功能,我们可以更好地理解和掌握文件系统的原理和实现方式。
此外,我们还可以拓展这个文件系统,添加更多的功能,例如文件的
备份和恢复、文件的压缩和解压缩等,以更好地满足用户的需求。