操作系统课程设计报告:Linux二级文件系统设计
- 格式:doc
- 大小:383.00 KB
- 文档页数:37
操作系统课程设计模拟简单二级文件管理系统*名:***学号:系别:计算机学院专业:网络工程年级:16级指导教师:2019年05 月11 日一、课程设计项目介绍(含项目介绍及设计目的)1、设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
2、项目介绍:为LINUX 设计一个简单的二级文件系统。
本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。
将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。
每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。
(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。
)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。
二、总体设计(含系统的总体结构、原理框图或各模块介绍等)1、系统总体结构图:2、模块介绍(1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。
(2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。
(3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。
linux的文件系统、目录结构、文件管理实验报告Linux是一款使用广泛的操作系统,具有丰富的文件系统、目录结构、文件管理系统。
以下是Linux文件系统实验报告。
一、文件系统文件系统是指计算机操作系统用来管理文件和数据存储空间的一种机制。
Linux系统使用的是可扩展的第二代文件系统(ext2、ext3、ext4),它支持更大的文件和更大的分区,并使用了更高效的索引和更快的文件系统检查。
二、目录结构Linux目录结构是一个统一的层次结构,它将计算机的所有文件都组织到一个合理的层次结构中。
以下是Linux常见的目录结构:1. /(根目录):根目录是文件系统的根节点,所有文件和目录都以它为起点。
2. /bin:包含一些最基本的系统工具,比如ls、cp、mv等常用命令。
3. /dev:包含系统设备文件。
4. /etc:包含系统中的配置文件和脚本文件。
5. /home:用于存储用户的个人文件和数据。
6. /lib:包含了系统中使用的一些共享库文件。
7. /mnt:用于挂载外部设备,比如USB、CD-ROM等。
8. /opt:用于存放第三方软件的安装文件和数据。
9. /proc:该目录是一个虚拟目录,它不占用实际存储空间,但可以查看和修改系统的运行状态。
10. /root:超级用户的家目录。
11. /sbin:包含一些管理系统的系统管理员使用的工具。
12. /tmp:用于存放临时文件和目录。
13. /usr:用于存放非本地(不是系统)用户的应用程序和数据。
14. /var:用于存放可变的数据,比如日志文件。
三、文件管理文件管理是指对计算机文件进行操作,如创建、复制、粘贴、移动和删除等。
下面是Linux 文件管理的一些常见命令:1. ls:列出目录中的文件和子目录。
2. cd:切换目录。
3. mkdir:创建一个新目录。
4. touch:创建一个新文件。
5. cp:复制文件或目录。
6. mv:移动或重命名文件。
*include<stdio.h>*include<string.h>*include<stdlib.h>*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 //最大写入文字长度128KB struct 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; /*当前打文件的数目*/};struct fatitem *fat; /*FAT表*/struct direct *root; /*根目录*/struct direct *cur_dir; /*当前目录*/ struct opentable u_opentable; /*文件翻开表*/ int fd=-1; /*文件翻开表的序号*/ char *bufferdir; /*记录当前路径的名称*/ char *fdisk; /*虚拟磁盘起始地址*/ void initfile();void format();void enter();void halt();int create(char *name);int open(char *name);int close(char *name);int write(int fd,char *buf,int len);int read(int fd,char *buf);int del(char *name);int mkdir(char *name);int rmdir(char *name);void dir();int cd(char *name);void print();void show();void initfile(){fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请1M空间*/format();}void format(){int i;FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址,引导区向后偏移1k)*//*-----初始化FAT表------------*/fat[0].item=-1; /*引导块*/fat[0].em_disk='1';for(i=1;i<ROOT_DISK_NO-1;i++) /*存放FAT表的磁盘块号*/{fat[i].item=i+1;fat[i].em_disk='1';}fat[ROOT_DISK_NO].item=-1; /*存放根目录的磁盘块号*/fat[ROOT_DISK_NO].em_disk='1';for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++){fat[i].item = -1;fat[i].em_disk = '0';}/*-----------------------------------------------*/root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/ /*初始化目录*//*---------指向当前目录的目录项---------*/root->directitem[0].sign = 1;root->directitem[0].firstdisk = ROOT_DISK_NO;strcpy(root->directitem[0].name,".");root->directitem[0].next = root->directitem[0].firstdisk;root->directitem[0].property = '1';root->directitem[0].size = ROOT_DISK_SIZE;/*-------指向上一级目录的目录项---------*/root->directitem[1].sign = 1;root->directitem[1].firstdisk = ROOT_DISK_NO;strcpy(root->directitem[1].name,"..");root->directitem[1].next = root->directitem[0].firstdisk;root->directitem[1].property = '1';root->directitem[1].size = ROOT_DISK_SIZE;if((fp = fopen("disk.dat","wb"))==NULL){printf("Error:\n Cannot open file \n");return;}for(i=2;i<MSD+2;i++) /*-子目录初始化为空-*/{root->directitem[i].sign = 0;root->directitem[i].firstdisk = -1;strcpy(root->directitem[i].name,");root->directitem[i].next = -1;root->directitem[i].property = '0';root->directitem[i].size = 0;}if((fp = fopen("disk.dat","wb"))==NULL){printf("Error:\n Cannot open file \n");return;}if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/{printf("Error:\n File write error! \n");}fclose(fp);}void enter(){FILE *fp;int i;fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请1M空间*/if((fp=fopen("disk.dat","rb"))==NULL){printf("Error:\nCannot open file\n");return;}if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/{printf("Error:\nCannot read file\n");exit(0);}fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/fclose(fp);/*--------------初始化用户翻开表------------------*/for(i=0;i<MOFN;i++){strcpy(u_opentable.openitem[i].name,");u_opentable.openitem[i].firstdisk = -1;u_opentable.openitem[i].size = 0;}u_opentable.cur_size = 0;cur_dir = root; /*当前目录为根目录*/bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));strcpy(bufferdir,"Root:");}void halt(){FILE *fp;int i;if((fp=fopen("disk.dat","wb"))==NULL){printf("Error:\nCannot open file\n");return;}if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */{printf("Error:\nFile write error!\n");}fclose(fp);free(fdisk);free(bufferdir);return;}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*DI SKSIZE;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;}}。
文件系统的设计及实现内容要求:为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2.列目录时要列出文件名,物理地址,保护码和文件长度。
3.源文件可以进行读写保护。
程序设计1.设计思想:采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
2.主要数据结构:(1) i节点struct inode {struct inode *i_forw;struct inode *i_back;char i_flag;unsigned int i_ino;unsigned int i_count;unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned int di_addr [NADDR];(2) 磁盘i节点struct dinode{unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned long di_size;unsigned int di_addr [NADDR];}(3) 目录项结构struct direct{char d_name [DIRSIZ]; unsigned int d_ino;}(4) 超级块struct filsys{unsigned short s_isize; unsigned long s_fsize; unsigned int s_nfree; unsigned short s_pfree; unsigned int s_free[NICFREE]; unsigned int s_ninode; unsigned short s_pinode; unsigned int s_inode[NICINOD]; unsigned int s_rinode;char s_fmod;};(5) 用户密码struct pwd{unsigned short p_uid; unsigned short p_gid;char *password [PWDSIZ];};(6) 目录struct dir{struct direct direct[DIRNUM]; int size;};(7) 查找内存i节点的hash表struct hinode{struct inode *i_frow;};(8) 系统打开表struct file{char f_flag;unsigned int f_count;struct inode *f_inode; unsigned long f_off;};(9) 用户打开表struct user{unsigned short u_default_mode; unsigned short u_uid;unsigned short u_gid;unsigned short u_ofile[NOFILE];};3.主要函数(1) i节点内容获取函数iget()(2) i节点内容释放函数iput()(3) 目录创建函数mkdir()(4) 目录搜索函数namei()(5) 磁盘块分配函数balloc()(6) 磁盘块释放函数bfree()(7) 分配节点区函数ialloc()(8) 释放i节点区函数ifree()(9) 搜索当前目录下文件的函数iname()(10) 访问控制函数access()(11) 显示目录和文件用函数_dir()(12) 改变当前目录用函数chdir()(13) 打开文件函数open()(14) 创建文件函数create()(15) 读文件用函数read()(16) 写文件用函数write()(17) 用户登录函数login()(18) 用户退出函数logout()(19) 文件系统格式化函数format()(20) 进入文件系统函数install()(21) 关闭文件函数close()(22) 退出文件系统函数halt()(23) 文件删除函数delete()4.主程序说明BeginStep1 对磁盘进行格式化Step2 调用install(),进入文件系统Step3 调用_dir(),显示当前目录Step4 调用login(),用户注册Step5 调用mkdir()和chdir()创建目录Step6 调用creat()创建文件0Step7 分配缓冲区Step8 写文件0Step9 关闭文件0和释放缓冲Step10 调用mkdir()和chdir()创建子目录Step11 调用creat(),创建文件1Step12 分配缓冲区Step13 写文件1Step14 关闭文件1和释放缓冲Step15 调用chdir()将当前目录移到上一级Step16 调用creat(),创建文件2Step17 分配缓冲区Step18 调用write(),写文件2Step19 关闭文件2和释放缓冲Step20 调用delete(),删除文件0Step21 调用creat(),创建文件3Step22 为文件3分配缓冲区Step23 调用write(),写文件3Step24 关闭文件3并释放缓冲区Step25 调用open(),打开文件2Step26 为文件2分配缓冲Step27 写文件3后关闭文件3Step28 释放缓冲Step29 用户退出(logout)Step30 关闭(halt)End该文件系统实际是为用户提供一个解释执行相关命令的环境。
操作系统课程设计Linux一、教学目标本课程的教学目标是使学生掌握Linux操作系统的核心概念、原理和应用技能。
通过本课程的学习,学生将能够:1.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出系统。
2.掌握Linux操作系统的安装、配置和管理方法。
3.熟练使用Linux命令行界面,进行日常操作和系统管理。
4.掌握Linux常用命令、 shell脚本编写和系统监控工具的使用。
5.了解Linux操作系统在服务器、嵌入式设备和云计算等领域的应用。
二、教学内容本课程的教学内容分为五个部分:1.操作系统概述:介绍操作系统的定义、功能和分类,以及Linux操作系统的历史和发展。
2.进程管理:讲解进程的基本概念、进程控制、进程同步和互斥、死锁及其解决方法。
3.内存管理:介绍内存分配与回收策略、内存保护、虚拟内存和分页分段机制。
4.文件系统:讲解文件和目录结构、文件访问控制、文件系统性能优化和磁盘空间分配策略。
5.输入/输出系统:介绍I/O设备管理、中断和DMA机制、设备驱动程序和I/O调度策略。
三、教学方法本课程采用多种教学方法相结合的方式,以提高学生的学习兴趣和主动性:1.讲授法:教师讲解操作系统的核心概念和原理,引导学生掌握基本知识。
2.讨论法:学生针对实际案例和问题进行讨论,培养学生的思考和分析能力。
3.案例分析法:分析Linux操作系统的实际应用案例,使学生了解操作系统的应用场景。
4.实验法:安排实验室课时,让学生亲自动手进行系统安装、配置和调试,提高学生的实践能力。
四、教学资源本课程的教学资源包括:1.教材:选用权威、实用的Linux操作系统教材,如《Linux操作系统原理与应用》。
2.参考书:提供相关的学术论文、技术博客和在线文档,供学生拓展阅读。
3.多媒体资料:制作课件、教学视频和演示文稿,辅助学生理解和记忆。
4.实验设备:提供Linux服务器、虚拟机和实验室环境,让学生进行实际操作。
操作系统二级文件管理课程设计课程设计名称:二级文件管理系统专业班级:学生姓名:学号指导老师:一、设计目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
二、设计内容为linux系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令(至少4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件rename 重命名(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。
三、程序设计1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、重命名、退出。
四、源代码1、FileSystem.h#define DIR_LENGTH 1024 //路径最长可达100字节#define MAX_WRITE 1024*128 //写入文字可达128k字节#define MEM_D_SIZE 1024*1024 //1M磁盘空间#define DISKSIZE 1024 //磁盘块的大小 1K#define MSD 5 //最大子目录数 5#define DISK_NUM MEM_D_SIZE/DISKSIZE //磁盘块数目 1024=1M/1K#define FATSIZE DISK_NUM*sizeof(struct FatItem) //FAT表大小1024*8=8K#define MOFN 5 //最大文件打开数 5#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 9#define ROOT_DISK_SIZE sizeof(struct Direct) //根目录大小 196#define LOGIN 15#define NAME_LONG 1#define NOT_EXSIT -1#define NOT_OPEN -1#define DIR_FULL -2#define OPEN_FULL -3#define ALREADY -4#define NOT_R_W -4#define DISK_FULL -5#define NOT_EXIT -1struct FatItem // size 8{ int item; //存放文件下一个磁盘的指针char em_disk; //磁盘块是否空闲标志位, 0 空闲};struct Direct{ struct FCB{ char name[8]; //文件/目录名 8位char property; //属性 1位目录 0位普通文件int size; //文件/目录字节数、盘块数)int firstDisk; //文件/目录起始盘块号int next; //子目录起始盘块号int sign; //1是根目录 0不是根目录}directItem[MSD+2]; //最大子目录 5};struct OpenTable{ struct OpenTableItem{ char name[9]; //文件名int firstdisk; //起始盘块号int size; //文件的大小char open_flag; //文件打开标志:'1':打开。
v .. . ..
. . . 资 料. .
操作系统(2014年秋季学期)
实 验 报 告
系别:计算机科学与技术 班级:信安12-1班 姓名:*** 学号:
实验名称:进程调度
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2022-4-26 2/17
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2022-4-26 4/17
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
}
五、编译过程截图
(下面是一个例子,换上你自己的图)
六、测试用例
(下面是一个例子,换上你自己的)
文字叙述一下测试过程的实例。
如先创建用户***、再产生文件****、再打开文件****,再写入内容********,再退出,再打开用户***,再将文件读出,读出的内容应该是*******。
等等。
六、实验结果
(下面是一个例子,换上你自己的图,给出根据测试用例的截图)。
本文档分别包含linux和windows两套程序目录一、课程设计的目的..........................二、课程设计的内容及要求...................内容..........................................要求..........................................三、实现原理.................................四、关键算法实现流程图 .....................流程图........................................关键算法......................................五、软件运行环境及限制 .....................六.结果输出及分析..........................七.心得体会.................................八.参考文献.................................一.课程设计的目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。
二.课程设计的内容及要求内容:为LINUX 设计一个简单的二级文件系统。
要求做到以下几点:1、可以实现下列几条命令(至少4条)。
Login 用户登录Dir 列文件目录Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件2、列目录时要列出文件名、物理地址、保护码和文件长度。
3、源文件可以进行读写保护。
从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:1、鼓励并优先个人独立选题设计,可从下面设计题目中选择,也可以自拟相关题目;如要合作,每组最多两名同学,且设计文档不能相同;2、可以在我们实验课最后布置的实验设计基础上进行完善和改进,但不能相同。
Linux操作系统报告单专业:计算机科学与技术学号:姓名:名称:文件和目录管理任课教师:班级:完成日期:成绩:一、实验名称及目的:实验名称:文件和目录管理实验目的:1、了解linux系统的文件和目录结构2、熟悉linux系统的文件和目录管理的方式和命令3、能够熟练的使用文件和目录管理命令二、实验内容及要求:1.查看操作系统的根目录下,有哪些目录2.文件操作(1)查看文件(可以是二进制的)内容 cat执行格式:cat filename 或more filename 或cat filename|more 例: cat file1 以连续显示方式,查看文件 file1 的内容 more file1或 cat file1|more 以分页方式查看文件的内容(2)删除文件rm执行格式: rm filename 例: rm file? rm f* (3)复制文件 cp执行格式:cp [r] source dest ination 例:cp file1 file2将 file1 复制成 file2cp file1 dir1 将file1复制到目录 dir1 cp /tmp/file1 将file1复制到当前目录cp /tmp/file1 file2 将file1复制到当前目录名为 file2 cp –r dir1 dir2 (recursive copy)复制整个目录(4)移动或更改文件、目录名称 mv执行格式: mv source destination 例:mv file1 file2 将文件 file1,更名为 file2mv file1 dir1 将文件 file1,移到目录 dir1 下 mv dir1 dir2(5)比较文件(可以是二进制的)或目录的内容 diff执行格式:diff [r] name1 name2 (name1、name2 同为目录)文件或例: diff file1 file2 比较 file1 与 file2 的不同处diff –r dir1 dir2 dir1 与 dir2 的不同处(6)文件中字符串的查找 grep专业:计算机科学与技术学号:姓名:执行格式:grep string file1例:grep abc file1 查找并列出串 abc 所在的整行文字 3、系统询问与权限口令(1)查看系统中的使用者执行格式: who (2)查看 username执行格式: who am I 查看自己的 username (3)改变自己的 username 的帐号与口令 su执行格式: su username例: su username 输入账号 Password 输入密码(4)文件属性的设置 chmod执行格式:chmod [R] mode name 其中:[-R]为递归处理,将指定目录下所有文件及子目录一并处理 mode 为 3-8 位数字,是文件/目录读、写、执行允许权的缩写(r:read,数字代号为"4", w:write,数字代号为"2", x:execute,数字代号为"1")mode: rwx rwx rwx user group other 缩写:(u)(g)(o)例:chmod 755 dir1 将将目录 dir1 设定成任何人皆有读取及执行的权利,但只有拥有者可作写修改。
操作系统课程设计报告:Linux 二级文件系统设计操作系统课程设计报告专业:计算机科学与技术学号:********姓名:***提交日期:2013-3-8【设计目的】(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】二级文件系统设计【实验环境】C++/VC++【相关知识综述】1.背景知识(1)外存管理文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。
在逻辑上它的层次结构是这样的:作为产品的操作系统有各自的文件系统。
比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。
(2)linux的EXT2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。
它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。
inode 也是一个重要的数据结构。
文件系统中的每个目录和文件均由一个inode描述。
它包含:文件模式(类型和存取权限)、数据块位置等信息。
一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。
比如EXT2提供的OPEN/CLOSE接口操作。
(3)用内存来模拟外存真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,所以这里推荐一种使用内存来模拟外存的方式,可以跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。
假定pInode是一个指向inode结构的指针,而且它已经放入的需要放入的数值了,现在需要将其写入到特定位置。
可用如下代码:……fd=fopen(“filesystem”,”w+b”);//fd 是FILE指针类型,w便是写方式,b表示二进制fseek(fd, specific_area,SEEK_SET);// fd是文件指针;specific_area为整形,// 为需要入pInode的位置fwrite(pInode, sizeof(inode), 1,fd);// 写入pInode信息2、原理算法本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
【设计思路】1、数据结构#define MAXNAME 25/*mfdname,ufdname,filename的最大长度*/#define MAXCHILD 50 /*最大的子文件个数*/ #define MAX (MAXCHILD*MAXCHILD) /*物理地址计数fpaddrno的最大长度*/typedef struct /*结构体OSFILE(文件)*/{int fpaddr; /*文件的物理地址号0,1,2...*/int flength; /*文件的长度*/ int fmode; /*文件模式:0-ReadOnly;1-Write Only;2-Read andWrite;3-protrcted;*/char fname[MAXNAME]; /*文件名*/} OSFILE;typedef struct /*结构体OSUFD(用户目录)*/{char ufdname[MAXNAME]; /*ufd的名字*/OSFILE ufdfile[MAXCHILD]; /*ufd自己的文件*/}OSUFD;typedef struct /*结构体OSUFD'LOGIN(用户注册)*/{char ufdname[MAXNAME]; /*ufd的名字*/char ufdpword[8]; /*ufd的密码*/} OSUFD_LOGIN;typedef struct /*文件打开模式*/{int ifopen; /*打开情况:0-close,1-open*/ int openmode; /*读写模式0-readonly,1-write only,2-read and write*/}OSUFD_OPENMODE;OSUFD *ufd[MAXCHILD]; /*ufd及ufd自己的文件(指针型)*/OSUFD_LOGIN ufd_lp; /*建立了一个OSUFD_LOGIN型的ufd_lp*/int ucount=0; /*mfd的ufd的个数*/int fcount[MAXCHILD]; /*ufd自己的文件个数*/int loginsuc=0; /*是否成功登陆,1成功*/char username[MAXNAME]; /*记录注册的用户名*/char dirname[MAXNAME];/*记录文件当前的目录*/int fpaddrno[MAX]; /*记录文件的物理地址num*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD]; /*创建一个OSUFD_OPENMODE型的数组用于记录每个文件的打开情况和读写模式*/FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file; /*定义FILE * 型的文件指针,用于读文件*/2、主要的函数说明void LoginF() /*用户注册登录*/void DirF() /*显示文件系统的所有文件*/ void CdF() /*改变路径*/void CreateF() /*创建文件*/void DeleteF() /*删除文件*/void ModifyFM() /*改变文件模式*/void OpenF() /*打开文件*/void CloseF() /*关闭文件*/void ReadF() /*读文件*/void WriteF() /*写文件*/void QuitF() /*退出文件系统*/void clrscr() /*清屏*/void help(void) /*帮助*/其他重要辅助函数:char *rtrim(char *str) /*移除最右边的空格*/char *ltrim(char *str) /*移除最左边的空格*/void SetPANo(int RorW) /*设置物理地址号(表示该地址号是否被用了0-未用,1-已用),RorW是0-read,1-write*/void InputPW(char *password) /*输入密码并使用'*'代替*/int ExistD(char *dirname) /*目录是否存在,存在返回第i个,不存在返回0*/int ExistF(char *filename) /*文件是否存在,返回返回第i个,不存在返回0*/int FindPANo() /*找出要分配的物理地址号*/int WriteF1() /*创建文件中的写文件*/3、程序流程设计:对于自己实现的4个功能:(1)open():(2)close():(3)write():(4)delete【源程序清单】Open,close,write、,delete函数代码如下:void OpenF() /*打开文件*/{char fname[MAXNAME];int i,k;if(strcmp(strupr(dirname),strupr(username))!=0) /*用户名和当前目录不同*/{printf("\nError! You can only open file in yourself dir.\n");else /*用户名和当前目录相同了*/{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname)); /*去除空格*/i=ExistF(fname); /*文件是否存在并返回第几个文件号*/if (i>=0) /*文件存在*/{k=ExistD(username); /*根据用户名确定用户号*/if(ifopen[k][i].ifopen==1) /*该文件已经打开*/{printf("\nError. file \'%s\' had been opened, it can not be opened again.\n",fname);}else /*该文件还未打开*/{if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdf ile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2)) /*该文件的属性是可以被打开的*/{ifopen[k][i].ifopen=1; /*打开,将ifopen设为1*/ifopen[k][i].openmode=(ufd[k]->ufdfile[i].fmo de); /*将ifopen.openmode设为该文件的模式*/printf("\'%s\' has been opened successfully!",fname);}else /*保护模式的文件不能被打开*/printf("\n\'%s\' is a protected file, it can not be opened.",fname);}}else /*文件不存在*/{printf("\nError.\'%s\' dose notexist.\n",fname);}}}void CloseF() /*关闭文件*/{char fname[MAXNAME];int i,k;if(strcmp(strupr(dirname),strupr(username))!=0) /*用户名和当前目录不同*/{printf("\nError.You can only modify filemode in yourself dir.\n");}else /*用户名和当前目录相同了*/{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname)); /*去除空格*/i=ExistF(fname); /*文件是否存在并返回第几个文件号*/if (i>=0) /*文件存在*/{k=ExistD(username); /*根据用户名确定用户号*/if(ifopen[k][i].ifopen==0) /*该文件未打开*/{printf("\nError. \'%s\' has been closed. you can not close it again.\n",fname);}else /*该文件已打开*/{ifopen[k][i].ifopen=0; /*关闭,置为0*/ifopen[k][i].openmode=4; /*修改打开模式为初始的打开模式*/printf("\'%s\' has been closed successfully!",fname);}}else /*文件不存在*/{printf("\nError. \'%s\' dose notexist.\n",fname);}}}void DeleteF() /*删除文件*/{char fname[MAXNAME];int i,k,x;char str[255],str1[255];if(strcmp(strupr(dirname),strupr(username))!=0) /*用户名和当前目录不同*/{printf("\nError. You can only delete file in yourself dir.\n");}else /*用户名和当前目录相同了*/{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname)); /*去除空格*/i=ExistF(fname); /*文件是否存在并返回第几个文件号*/if (i>=0) /*文件存在*/{k=ExistD(username); /*根据用户名确定用户号*/if(ufd[k]->ufdfile[i].fmode==3) /*该文件的属性是protect的*/{printf("\n\'%s\' is a protected file, it can not be deleted.",fname);}else /*该文件的属性不是protect的可以删除*/{if(ifopen[k][i].ifopen==1) /*该文件已打开不能删*/printf("\n\'%s\' has been opened, it can not be deleted.",fname);else /*关闭的可以删*/{itoa(ufd[k]->ufdfile[i].fpaddr,str,10); /*itoa是将整型转换为字符串,存入str中,10代表10进制*/strcpy(str1,"file");strcat(str1,str); /*str连到str1后*/strcpy(str,"c:\\osfile\\file\\"); /*文件目录拷到str中*/strcat(str,str1); /*把str1连入,最后str为c:\\osfile\\file\\filex*/x =_unlink(str); /*删除路径为str 的文件,删除成功返回0,否则返回-1*/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]--; /*删除后第k个用户的文件数减1*/printf("\'%s\' has been deleted successfully!",fname);}}}else /*文件不存在*/{printf("\nError. \'%s\' dose not exist.\n",fname);}}}void WriteF() /*写文件*/{char str[50],str1[50];int i,k,n=0;char fname[MAXNAME];char *rtrim(char *str);char *ltrim(char *str); /*移除空格*/int ExistF(char *filename); /*文件名是否存在返回文件号,Exist-i,Not Exist-0*/int ExistD(char *dirname);if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0) /*如果当前目录为空(主目录)*/{printf("\nError.Please convert to ufd dir before write.\n"); /*必须转到用户目录下*/ return;}else{printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname); /*第几个用户*/for(i=0;i<fcount[k];i++) /*第k个用户有多少个文件*/{if (ifopen[k][i].ifopen==1) /*如果文件已打开*/if ((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2)) /*可以读*/{printf("%15s",ufd[k]->ufdfile[i].fname); /*输出这个已打开的可读的文件名*/n++;}if((n%4==0)&&(n!=0))printf("\n"); /*4个换行*/}printf("\n%d files openned.\n",n);if (n==0) /*无打开的文件,返回*/return;if(n!=0) /*有打开的文件*/{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname)); /*移除空格*/i=ExistF(fname); /*第几个文件号*/if(i>=0) /*文件存在*/{if(ifopen[k][i].ifopen==1) /*已打开*/{if((ifopen[k][i].openmode==1)||(ifopen[k][i].openmode==2)) /*属性可以写*/{itoa(ufd[k]->ufdfile[i].fpaddr,str,10); /*将文件号整形转为字符串*/strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1); /*str形成路径c:\\osfile\\file\\filex*/fp_file=fopen(str,"wb+"); /*以写二进制方式(并且先清除已有的内容)打开filex 文件*/int length=0;char c;printf("Please input text(\'#\' stands for end):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c); /*写入字符到文件filex中*/if (c!='\n')length++;}getchar();/*接收回车*/fprintf(fp_file,"\n");fclose(fp_file);printf("write successfully!\n");ufd[k]->ufdfile[i].flength=length; /*记录文件长度*/}else /*属性不可以写*/{printf("\nError.\'%s\' has been opened with read ONLY mode. It isn\'t write.\n",fname);}}else /*文件未打开*/{printf("\nError.\'%s\' is in closing status. Please open it before write\n",fname);}}else /*文件不存在*/{printf("\nError. \'%s\' does not exist.\n",fname);}}}}【测试结果】登录系统,并创建用户创建文件并退出程序重新登录后浏览列表,打开文件,阅读文件并重写文件重写后阅读并关闭浏览文件并删除文件删除后再次浏览文件【设计总结】为了完成这次的课程设计,我复习了大一学期学的C语言的文件部分,因为那里我一直没有掌握好,遇到问题查阅MSDN帮助文档,并且为了方便阅读,我把老师之前给的英文注释改成了中文注释,自己还添加了很多注释。