实验五 文件系统设计

合集下载

文件系统实验 模拟设计文件操作

文件系统实验 模拟设计文件操作

实验五文件系统实验一. 目的要求. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。

二. 例题:设计一个N个用户的文件系统,每次用户可保存L个文件,一次运行用户可以打开S个文件。

程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。

另外,为打开文件设置了运行文件目录,用户已打开文件表UOF.。

为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作算法与框图:因系统小,文件目录的检索使用了简单的线性搜索。

文件保护简单使用了保护码:允许读写执行、对应位为1,对应位为2,和对应位为3。

程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)打开文件目录(UOF)(即运行文件目录)主文件目录MFD:用户文件目录UFD用户已打开文件表UOF二、实验要求:显示初始的文件目录表、输入的文件操作命令和每条命令执行后的UOF文件,程序运行后打印所有用户的文件目录表。

假定文件系统提供的文件操作有建立文件(CREATE),打开文件(OPEN),关闭文件(CLOSE),读文件(READ),写文件(WRITE)和删除文件(DELETE),在模拟程序中可以从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序执行。

主程序结构流图如下:用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和和要求如下:①建立文件:create(文件名,文件长度,文件属性)②写文件:write(文件名,记录号)有两种情况,第一种是在执行create后要求写,第二种是在执行open 后要求写,即对一个已存在的文件进行修改。

文件系统实验报告

文件系统实验报告

文件系统实验报告文件系统实验报告篇一:内核,文件系统实验报告一嵌入式系统实验报告(一) 091180083刘浩通信工程一、实验目的了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybx软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。

二、嵌入式系统开发实验1、mini和tftp(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。

本实验中用到的是RS-232C标准的接口。

(2)软件结构:mini 运行mini,Ctrl+A-进入mini的cnfiguratin界面。

对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。

保存好设置后以后可以不用再设置。

(3)btlader引导:给开发板加电,任意按下一个键进入btlader界面。

可以通过命令行方式进行设置,按0进入命令行模式,出现 51bard,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。

注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。

(4)通过btlader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。

由于btlader需要从服务器上下载内核和文件系统,一般采用tftp服务。

进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。

再设置完后要重新启动tftp服务。

文件系统课程设计

文件系统课程设计

文件系统 课程设计一、课程目标知识目标:1. 理解文件系统的基本概念、组成结构与功能。

2. 掌握不同类型文件系统的特点及其适用场景。

3. 学习文件的组织、存储与访问控制方法。

技能目标:1. 能够运用所学知识对文件系统进行操作与管理。

2. 培养学生设计简单的文件系统的能力,提高解决问题的实践技能。

3. 能够分析文件系统的性能,并进行优化建议。

情感态度价值观目标:1. 培养学生积极主动探究文件系统知识的兴趣,形成良好的学习习惯。

2. 树立正确的信息管理观念,认识到文件系统在信息时代的重要性。

3. 增强学生的团队协作意识,提高沟通与交流能力。

本课程针对高年级学生,结合课程性质,注重理论与实践相结合,充分调动学生的主观能动性。

通过本章节的学习,旨在让学生掌握文件系统的基本知识与技能,同时培养他们解决实际问题的能力,提高信息素养。

教学要求注重培养学生的实践操作能力、创新思维和团队协作能力,使学生在掌握知识的同时,形成积极向上的情感态度与价值观。

二、教学内容1. 文件系统概述:介绍文件系统的基本概念、发展历程、功能与作用。

- 教材章节:第一章 文件系统概述- 内容列举:文件、目录、磁盘空间分配等基本概念;文件系统的演变与发展趋势;文件系统的主要功能与作用。

2. 文件系统的类型与结构:分析不同类型文件系统的特点、存储结构及其适用场景。

- 教材章节:第二章 文件系统类型与结构- 内容列举:磁盘文件系统、网络文件系统、分布式文件系统等;文件的逻辑结构与物理结构;文件系统的性能比较。

3. 文件操作与管理:讲解文件的组织、存储、访问控制方法以及相关操作。

- 教材章节:第三章 文件操作与管理- 内容列举:文件的创建、删除、修改、复制等操作;文件存储与访问控制权限;目录的组织与管理。

4. 文件系统性能优化:探讨文件系统性能评价方法,分析如何进行性能优化。

- 教材章节:第四章 文件系统性能优化- 内容列举:文件系统性能评价指标;文件系统性能优化策略;磁盘空间分配策略。

实验五 文件系统设计

实验五  文件系统设计

实验五文件系统设计一、文件的系统调用1.文件描述符(fd)UNIX的底层输入输出系统调用用一个整数来代表所打开的文件,这就文件描述符。

文件描述符与打开的文件名建立一一对应的关系。

2.Creat/link/unlink系统调用Fd=creat(name,pmode);Name为文件名,整数pmode为文件的许可机制。

Link建立链接,unlink删除链接。

3.Open/close系统调用Fd=open(name,rwmode,[,pmode]);Rwmode表示读写方式的整数,0—只读,1—只写,2—读写Status=close(fd);用fd指明欲关闭的文件,成功为0,出错为1.4.read/write系统调用n=read(fd,buffer,size);n=write(fd,buffer,size);buffer是字符指针,存放读/写字节流的地址。

5.随机存取的系统调用lseek和tellnewpos=lseek(fd,offset,origin);offset为位移量,origin=0从文件头开始,1从当前位置开始,2从文件尾开始。

Pos=tell(fd);报告当前文件指针的位置。

6.①记录锁定技术的描述记录的锁定:就是进程在对文件的某个部分进行某种操作期间,为这部分文件内容设立一个“正在使用”的标志,防止其它进程对文件的这个部分进行操作。

status=lockf(fd,func,size);#define F-ULOCK 0 开锁#define F-LOCK 1 锁定#define F-TLOCK 2 测试是否锁定,锁返回-1,未锁则锁定#define F-TEST 3 测试是否锁定,锁返回-1,未锁返回0②记录锁定技术举例父子进程对同一文件进行锁定的操作分析下面程序的执行结果:#include <stdio.h>#include <unistd.h>main(){int fd,a[10],i;for (i=0;i<10;i++) a[i]=i+1;fd=creat("aaa",0755);printf("lockf 40 bytes in parent…\n"); fflush(stdout); lockf(fd,1,40);printf("…locked.\n");fflush(stdout);if (fork()==0){printf("Enter child,write 20 bytes in child…\n"); fflush(stdout);write(fd,a,20);printf("…writeen.\n");fflush(stdout);printf("lockf 80 bytes in child…\n");fflush(stdout); lockf(fd,1,80);printf("…locked in child.\n");fflush(stdout);sleep(2);lockf(fd,0,80);printf("…child unlocked.\n");fflush(stdout);exit(0);}printf("Parent sleep now…\n");sleep(0);printf("…parent wakeup.\n");printf("Parent unlock now…\n");fflush(stdout);lockf(fd,0,40);printf("…Parent unlocked.\n");fflush(stdout);wait(0);printf("Program end.\n");}二、实验内容为Linux系统设计一个简单的文件系统。

操作系统实验-文件系统设计

操作系统实验-文件系统设计

操作系统实验-文件系统设计文件系统设计1.目的和要求本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

实验要求:①在系统中用一个文件来模拟一个磁盘;②此系统至少有:Create、delete、open、close、read、write 等和部分文件属性的功能。

③实现这个文件系统。

④能实际演示这个文件系统。

基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。

2.实验内容1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。

2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。

另外,为打开文件设置了运行文件目录(AFD)。

3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。

4)因系统小,文件目录的检索使用了简单的线性搜索。

5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。

6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录。

3.实验环境VC 6.04.实验提示1) format 格式化只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化用户passwd 文件,写入模拟硬盘文件。

2 )install 安装读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取用户passwd 文件。

3 )login 登陆用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。

正确则登陆成功,当前目录设定到当前用户文件夹下。

Login登录结束是,登录成功输入用户名查找是否有改用户名输入密码是否密码是否正确否4 )ialloc 申请inode 空间先检测inode 位图是否加锁,是则退出。

文件系统

文件系统

实验5 文件系统设计1、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

2、实验内容为linux系统设计一个简单的二级文件系统。

要求做到以下几点:(1)可以实现下列几条命令(至少4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。

3、实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建的文件,可以编号存储于磁盘上。

如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。

实验5指导[实验内容]<任务>为Linux系统设计一个简单的二级文件系统。

要求做到以下几点:1.可以实现下列几条命令:login用户登录dir 列目录create创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护<程序设计>(1)设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。

另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。

对这些内容感兴趣的读者,可以在本系统的程序基础上进行扩充。

(2)主要数据结构a)I节点struct inode{struct inode *i_forw;struct inode *i_back;char I_flag;unsigned int i_into; /*磁盘i节点标号*/unsigned int i_count; /*引用计数*/unsigned short di_number; /*关联文件书,当为0时,则删除该文件*/unsigned short di_mode; /*存取权限*/unsigned short di_uid; /*磁盘i节点用户*/unsigned short di_gid; /*磁盘i节点组*/Unsigned int di_addr[NADDR]; /*物理块号*/b) 磁盘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]; /*物理块号*/c)目录项结构Struct direct{char d_name[DIRSIZ]; /*目录名*/unsigned int d_ino; /*目录号*/}d)超级块Struct filsys{unsigned short s_isize; /*i节点块块数*/unsigned long s_fsize; /*数据块块数*/unsigned int s_nfree; /*空闲块块数*/unsigned short s_pfree; /*空闲块指针*/unsigned int s_free[NICFREE]; /*空闲块堆栈*/unsigned int s_ninode; /*空闲i节点数*/unsigned short s_pinode; /*空闲i节点指针*/ unsigned int s_inode[NICINOD]; /*空闲i节点数组*/ unsigned int s_rinode; /*铭记i节点*/char s_fmod; /*超级块修改标志*/};e)用户密码Struct pwd{unsigned short P_uid;unsigned short P_gid;char passward[PWOSIZ];}f) 目录Struct dir{strut direct direct[DIRNUM];int size;}g).查找i内存节点的hash表Struct hinode{strut inode *iforw;}h).系统打开表Struct file{char f_flag; /*文件操作标志*/unsigned int f_count; /*引用计数*/struct inode *f_inode; /*指向内存节点*/unsigned long f_off; /*读/写指针*/}i)用户打开表Struct user{unsigned short u_default_mode;unsigned short u_uid; /*用户标志*/unsigned short u_gid; /*用户组标志*/unsigned short u_ofile[NOFILE]; /*用户打开表*/}3.主要函数(1)i节点内容获取函数iget()(详细描述略)。

操作系统实验五-文件系统

操作系统实验五-文件系统

计算机科学与技术学院2018-2019学年第一学期《操作系统》实验报告班级: XXXXXXX学号: XXXXXXXXX姓名: XXX教师: XXX成绩:1. 题目分析设计目的深入了解磁盘文件系统的实现。

设计内容(1)设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:(2)支持多级目录结构,支持文件的绝对读路径;(3)文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;(4)采用文件分配表;(5)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。

(6)最后编写主函数对所做工作进行测试。

相关知识概述(1)文件的操作:①创建文件;②删除文件;③读文件;④写文件;⑤设置文件读/写位置。

(2)文件的逻辑结构:从用户的观点出发所能观察到的文件组织形式,即问价是由一系列的逻辑记录组成的,是用户可以直接处理的数据及其结构。

文件的物理结构:系统将文件存储在外存上所形成的一种存储组织形式,用户不可见。

(3)磁盘空间的管理:采取合理的文件分配方式,为每个文件分配必要的存储空间,使每个文件都能“各得其所”,并能有效减少磁盘碎片。

(4)磁盘目录结构2. 实验设计基本设计思路用一个文件模拟磁盘:FAT 根目录目录1目录2目录3目录4…文件1文件2…文件分配表FAT(128B):第几项0 1 2 3 4 5 6 7 8 9 …内容-1 -1 -1 4 9 0 7 8 -1 12 …根目录(64B)目录1(64B)目录6(64B)目录……….实验中,模拟的磁盘有128块,每块64B,故文件分配表有128项,每项3一个字节,共占磁盘的前两块,盘块编号0、1;根目录紧邻在文件分配表后面,占编号为2的盘块。

01234567891011128B8B8B8B8B8B8B8B文件管理系统要实现的功能包括:(1)磁盘操作:①磁盘分配(2)目录操作:①建立目录②显示目录内容③删除空目录(3)文件操作:①建立文件②打开文件③关闭文件④读文件⑤写文件⑥删除文件(磁盘回收)⑦显示文件内容⑧改变文件属性⑨使用绝对路径名查找文件(4)对数据结构——已打开文件表的操作:①在已打开文件表中查找某文件②将文件从已打开文件表中删除③将某文件插入已打开文件表主要数据结构描述1、每个目录项的数据结构(8B):typedef struct{char name[3];开始找到文件分配表第x项,i=x第i项值是否为第i项是否为最后一项磁盘满,分配失败结束i=i+1分配第i块NYNY图2-10分配一个磁盘块的流程图结束查找路径名为pname的文件i=0i为已打开文件表一栏查找成功结束查找失败i=i+1文件路径名相符NNYY图2-13 在已打开文件表中查找某文件开始删除路径名为n ame 的文件在已打开文件表中查找路径名为n ame的登记项i找到该文件登记项删除第i项:[i]=openfile[]=结束文件没有打开,删除失败NY结束插入路径名为n ame的文件在已打开文件表中查找路径名为n ame的登记项找到该文件登记项已打开文件表已满文件登记表满,无法打开文件结束在[length]处填写该文件的各项内容:=+1文件已打开YNYN图2-15将某文件插入已打开文件表的流程图图2-14 将某文件从已打开文件表中删除的流程开始 关闭文件路径名为 name 的文件 查找已打开文件表文件打开 追加文件结束符修改目录中文件长度 结束文件未打开, 无法关闭文件结束在已打开文件表中删 除该文件登记项操作为 “ 写 ”NNY Y图 2-20模拟关闭文件的流程图开始读 n ame 文件 l ength 字节查找已打开文件表文件打开文件以读方式打开从已打开文件表的到读指针 :将盘块d um 读入缓冲 b uffer1 文件未打开 , 无法读文件结束文件不能读结束t=0文件未结束且 t<=length显示读出内容; 修改读指针的 b unum: bnum=bnum+1t=t+1读完一个盘块修改读指针 bnum=0;: dnum= 文件分配表第 n um 项将盘块 d num 读入缓冲 b uffer1读文件结束 结束NYNNNYYY结束显示路径名为name的文件查找目录n ame找到该文件文件打开dnum=该目录起始盘块号第d num块是该文件一块第d num块内容读入buffer1显示b uffer1中的内容结束或到文件结束符dnum=FAT 第d num项结束结束文件打开,显示文件失败结束指定的文件不存在,显示文件内容失败NYNYNY编码实现实现过程总结部分功能代码:(1)目录操作:①建立目录:int md(char *pathName, char *contentName, char address) ame[0] = '$';}fseek(fc, address * 64, SEEK_SET);fwrite(contentBuffer, 64L, 1, fc);return 1; ttribute == 8) ame << endl;cout << "类型:空" << endl;cout << "属性:目录项" << endl;cout << "起始地址:" << (int)contentBuffer[i].address << endl;cout << "长度:1" << endl << endl;}else if (contentBuffer[i].name[0] == '$'){cout << "一个空的目录登记项" << endl;}else{cout << "名字:" << contentBuffer[i].name << endl;cout << "类型:" << contentBuffer[i].type << endl;if (contentBuffer[i].attribute == 3){cout << "属性:只读系统文件" << endl;}else{cout << "属性:可读可写的普通文件" << endl;}cout << "起始地址:" << (int)contentBuffer[i].address << endl;cout << "长度" << (int)contentBuffer[i].length << endl << endl;}}}(2)文件操作:①建立文件:bool create_file(){ttribute;= temp->address;= temp->length;= flag;pointer read, write;= dnum;= 0;= dnum;= 0;= write;= read;(cu);return 3;}③关闭文件:int close_file(char *pathName){list<OFILE>::iterator it;int i = 0;for (it = (); it != ();){if (strcmp(it->name, pathName) == 0){it = (it);return 1;}else{++it;}}return 0;}④读文件:bool read_file(char *pathName){int a;unsigned char c;bool flag = false;OFILE exist;list<OFILE>::iterator it;int i = 0;for (it = (); it != (); it++){if (strcmp(it->name, pathName) == 0){exist = *it;flag = true;break;}}if (flag == false){return flag;}int dnumTemp = fseek(fc, 64 * SEEK_SET);for (i = 0; i < ; i++){cout << "第" << << "个盘块内容如下:" << endl;while{if % 8 == 0){cout << endl;}c = getc(fc);a = c;cout << hex << " " << a;}= 0;fseek(fc, SEEK_SET);c = getc(fc);if (c == 255){cout << "文件末尾" << endl;break;}= c;fseek(fc, * 64, SEEK_SET);cout << endl;}return flag;}⑤写文件:bool write_file(char *pathName){int dnum; ;type = (pointPosition + 1, ());everyPath = (0, pointPosition);}结果分析与总结结果分析部分功能演示:总结与建议总结:通过本次实验我学会了如何建立文件管理系统,学会了一些常用的目录、问津功能的实现,还学会了如何用文件读写指针对文件进行操作。

(超详细)西电软院操作系统实验报告DOC

(超详细)西电软院操作系统实验报告DOC

(超详细)西电软院操作系统实验报告DOC操作系统课程设计实验报告册班级:1313012学号:...姓名:lan教师:杜军朝目录实验1 Linux(虚拟机)安装及Linux常用命令使用实验2 makefile的编写及Linux内核编译实验3 Linux的进程和线程实验4 同步与互斥实验5 文件系统重要提示:1.实验正文建议使用小四号或五号宋体。

2.若附加图形,则请直接嵌入到实验手册相应位置。

3.各实验的源程序,请按实验分目录存放,如第一个实验的源程序存放在目录lab1下,第二个实验的源程序存放在目录lab2下等等,依次类推。

4.可互相讨论,但严禁抄袭网络或同学的实验结果。

实验编号 1 题目Linux(虚拟机)安装及Linux常用命令使用实验目的1、掌握至少一种Linux系统的安装2、掌握虚拟机平台(Vmware Workstation)的使用和配置3、掌握至少一种配置Vmware中Linux系统与宿主机Windows 系统的文件交换的方法4、掌握常用的Linux命令5、了解Linux的帮助系统实验内容1、Linux(虚拟机)安装及Linux常用命令使用报告1、目录操作命令正文2、文件操作命令3、文本文件查看命令4、用户系统命令5、网络相关命令6、U盘的使用方法7、用户管理命令8、用户组账号管理9、文件权限设置10、设置文件属主和属组实验编号 2 题目makefile的编写及Linux内核编译实验目的1、掌握Linux中makefile文件的编写2、理解Linux内核的Makefile3、掌握至少一个版本Linux内核的编译步骤4、了解Linux内核的配置过程实验内容1、准备工作:相关软件的获取与安装(源代码,软件包)2、编译工作:配置,编译3、修改启动配置文件:修改grub2启动项4、能够正确的编译源代码5、能够用编译出的内核启动系统报告内容要求(1) 实现方法和思路(2) 测试及结果报告正文内核编译过程1、拷贝源代码到/usr/src目录下将文件添加共享文件夹中,然后在terminal输入以下命令:cd /mnt/hgfscp -r packages /usr/srccp linux-2.6.32.60 /usr/src2、在usr/src目录下解压源码:cd /usr/srctar xvf linux-2.6.32.60.tar.bz23、拷贝packages到“~”目录下:cd /usr/srccp -r packages ~4、安装软件包:dpkg –i *.deb5、转到内核源代码所在的目录“/usr/src/linux-2.6.32.60”:cd /usr/src/linux-2.6.32.606、输入make menuconfig,进入general setup选项,进入local version 菜单,添加版本标示:lan,保存并退出。

操作系统实验---文件系统

操作系统实验---文件系统

实验报告实验题目:文件系统姓名:学号:课程名称:操作系统所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称文件系统一、实验目的与要求:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。

2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。

3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。

4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。

二、实验设备及软件:一台PC(Linux系统)三、实验方法(原理、流程图)试验方法(1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建文件,可以编号存储于磁盘上。

如file0,file1,file2…并以编号作为物理地址,在目录中登记。

文件系统功能流程图图1.文件系统总体命令分析图 2.登录流程图图 3. ialloc流程图图4.balloc流程图图5.密码修改流程图图6.初始化磁盘图 7.显示所有子目录 dir/ls 操作流程图图8.创建文件 creatfile 、创建目录 mkdir 流程图图9.改变当前路径 cd 操作流程图实验原理1.文件操作◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。

在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。

具体流程图查看第二节,系统流程图设计部分。

◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。

在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。

计算机软件系统文件系统设计试验报告

计算机软件系统文件系统设计试验报告
(2)用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。
实验步骤与调试过程:
用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。主要数据结构:节点2.磁盘i结点3.目录项结构4.超级块 5.用户密码6.目录7.查找i内存节点的hash表8.系统打开表9.用户打开表
疑难小结:
通过本次试验,我对文件系统设计思想有了进一步的了解,通过动手实现其文件系统设计,更加深刻的理解了文件系统设计的不同特点。同时,在实验过程中,回顾书本上的理论知识,巩固了我的知识。了解了,文件系统实际是为用户提供一个解释执行相关命令的环境。主程序中的大部分语句都被用来执行相应的命令。应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。
Step25 调用ope写文件3后关闭文件3
Step28 释放缓冲
Step29 用户退出(logout)
Step30 关闭(halt)
End

1.编写管理文件makefile
本文件系统程序用编写makefile管理工具进行管理。其内容如下:
设置:主要函数节点内容获取函数iget()(详细描述略)。2.节点内容释放函数iput()(详细描述略)。3.目录创建函数mkdir()(详细描述略)。4.目录搜索函数namei()(详细描述略)。5.磁盘块分配函数balloc()(详细描述略)。6.磁盘块释放函数bfree()(详细描述略)。7.分配i节点区函数ialloc()(详细描述略)。8.解释结点区函数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.文件删除函数delecte( )(详细描述略)。

Lniux文件系统实验报告

Lniux文件系统实验报告

实验五文件系统
一、实验目的
1.掌握Linux系统下fdisk命令的用法。

2.掌握Linux系统下文件系统的创建、挂载与卸载。

3.掌握Linux系统下利用RAID技术实现磁盘冗余阵列的方法。

二、实验内容
1.磁盘分区管理
2.动态磁盘管理
三、实验指导
1.服务器现需要新建一块20GB的硬盘,需要对新增的硬盘进行分区管理、分区方案为/user目录所在分区10GB,/backup目录所在分区5GB,/home目录所在分区5GB。

步骤一,添加新硬盘
点击“编辑虚拟机设置”按钮,如下图
选择添加硬盘,如下图
下一步选择“SCSI(S)推荐”,如下图
下一步创建“新虚拟磁盘”,设置磁盘空间大小为“20GB”,如下图所示
单击完成,即完成了新硬盘的添加,如下图所示
通过fdisk -l命令查看新硬盘是否添加成功
步骤二,利用fdisk命令对/dev/sdb/进行分区
步骤三,格式化新建分区,在各分区上建立ext3类型的文件的系统,建立时要求检查磁盘坏块并显示详细信息。

步骤四,将/dev/sdb1挂载到/user目录,/dev/sdb2挂载到
/backup目录,/dev/sdb3挂载到/home目录
2、某公司的Linux服务器新增两块硬盘,硬盘大小为40GB。

为了实现数据保护功能,现需利用2块硬盘创建RAID1卷。

要求创建的RAID设备名为/dev/md110,并利用mkfs命令创建ext3文件系统。

最后将文件系统挂载到系统上。

四、实验总结
通过本次实验,我学习到fdisk 的一些命令和在Linux 系统下利用RAID 技术实现磁盘冗余阵列的方法。

简单文件系统的实现实验报告

简单文件系统的实现实验报告

操作系统课程设计报告简单文件系统的实现专业:班级:姓名:学号:老师:一、课程设计的目的1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。

二、课程设计要求1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。

在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。

2文件存储空间的分配可采用显式链接分配或其他的办法。

3空闲磁盘空间的管理可选择位示图或其他的办法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。

文件目录结构采用多级目录结构。

为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

要求提供以下有关的操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。

my_mkdir:用于创建子目录。

my_rmdir:用于删除子目录。

my_ls:用于显示目录中的内容。

my_cd:用于更改当前目录。

my_create:用于创建文件。

my_open:用于打开文件。

my_close:用于关闭文件。

my_write:用于写文件。

my_read:用于读文件。

my_rm:用于删除文件。

my_exitsys:用于退出文件系统。

三、程序的设计细想和框图1.打开文件函数fopen()(1)格式:FILE *fopen(const char *filename,const char *mode)(2)功能:按照指定打开方式打开指定文件。

(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。

简单文件系统的实现的实验报告

简单文件系统的实现的实验报告

杭州电子科技大学操作系统课程设计课程设计题目:简单文件系统的实现姓名:庄严班级:09056011学号:09056012学院:计算机学院专业:计算机科学与技术(2+2)负责老师:胡志凌完成日期:2012-5-28简单文件系统的实现一,课程设计的目的1,通过具体的文件爱你存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结、功能及实现过程的理解二,设计要求1,在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的但用户单任务系统的文件系统。

在退出文件系统的使用时,应将虚拟文件系统一个Windows文件的方式保存到磁盘中,以便下次再将它恢复到内存的虚拟磁盘空间中2,文件存储空间的分配可采用显示链接分配或其它方法3,空闲磁盘空间的管理可选择位示图或其它方法4,文件目录结构采用多级目录结构5,需要提供一以下操作命令i.Formatii.Mkdiriii.Rmdiriv.Lsv.Cdvi.Createvii.Openviii.Closeix.Writex.Readxi.Rmxii.Exit三,程序设计思想以及总流程图1,程序设计思想i.首先,在文件系统启动时,申请一块较大的内存,用来当作文件系统的磁盘空间ii.然后,对其进行格式化,虚拟磁盘的空间布局是仿照FA T16文件系统,结构如下:1块2块2块995块引导块 FA T1 FA T2 数据区格式化时,主要包括引导块,FA T1,FA T2,的一些初始化工作例如设置文件魔数,文件系统的信息,FA T1,FA T2的信息等等iii.根据用户输入的命令,调用对应的函数.2,程序流程图四,系统各个功能的实现思想1,创建目录a)调用do_read读入当前目录文件到内存,检查新建文件目录是否重名b)分配一个空闲的打开文件表项c)分配一个空闲的盘块d)在当前目录中问新建目录寻找一个空闲的目录项e)设置FCB,文件的属性信息f)创建特殊的两个目录项‘.’,‘..’g)返回2,Cd命令a)Open指定的目录名,调用read读入该父目录到内存b)检查新的当前目录名是否存在c)关闭原当前目录d)设置当前目录为该目录3,Rmdir命令a)Read读入当前目录文件内容到内存,检查要删除的文件目录是否存在b)检查该目录是否为空c)检查是否已经打开,打开用close则关闭d)回收给目录文件的磁盘块e)修改该目录文件的目录项f)修改用户打开表项的长度信息g)返回4,Ls命令a)Read当前目录到内存b)读出目录文件的信息,显示到屏幕上c)返回5,Create命令a)分配一个空闲的打开文件表项b)检查新文件的父目录是否打开c)Read该父目录的文件到内存,并检测新建的文件名是否重名d)检查是否有空闲盘块e)寻找空闲的目录项f)准备好新文件的F CBg)调用close关闭打开的父目录文件h)返回6,Rm命令a)检查要删除的文件的父目录是否已打开b)Read父目录到内存c)检查文件是否打开d)回收磁盘快e)清空该文件的目录项f)修改用户打开文件表项中的长度信息g)返回7,Open命令a)检查该文件名是否存在b)Read该父目录到内存c)检查用户打开的文件表中是否有空闲表项d)为该文件填写空白用户打开文件表项内容e)返回8,Closea)检查fd的有效性b)检查用户打开文件表表项的fcbstate字段c)回收该文件占据的用户打开文件表表项d)返回9,Write命令a)检查fd的有效性b)提示用户输入写方式c)提示用户输入内容d)调用do_write()将键入的内容写入到文件中e)返回写入的字节数五,系统的详细过程#include<stdio.h>#include<malloc.h>#include<time.h>#include<stdlib.h>#include<str ing.h>#define BLOCKSIZE 1024#define SIZE 1024000#define END 65535#define FREE 0#define ROOT_BLOC KNUM 2#define MAX_OPEN_FILE 10#define MAX_TXT_SIZE 10000typedef struct FCB{char filename[8]; /*8B文件名*/char exname[3]; /*3B扩展名*/unsigned char attr ibute; /*文件属性字段*/char retainbyte[10] ; /*10B保留字*/unsigned short time; /*文件创建时间*/unsigned short date; /*文件创建日期*/unsigned short first; /*首块号*/unsigned long length; /*文件大小*/}fcb;/*文件分配表file allocation table*/typedef struct FAT{unsigned short id;}fat;/*属性对照表位7 6 5 4 3 2 1 0属性保留保留存档子目录卷标系统文件隐藏只读*/typedef struct USEROPEN{char filename[8]; /*8B文件名*/char exname[3]; /*3B扩展名*/unsigned char attr ibute; /*文件属性字段*/char retainbyte[10] ; /*10B保留字*/unsigned short time; /*文件创建时间*/unsigned short date; /*文件创建日期*/unsigned short first; /*首块号*/unsigned long length; /*文件大小*/char free; /*表示目录项是否为空0空1分配*/int father; /*父目录的文件描述符*/int dirno; /*相应打开文件的目录项在父目录文件中的盘块号*/int diroff; /*相应打开文件的目录项在父目录文件的dirno盘块中的目录项序号*/ char dir[MAX_OPEN_FILE][80];/*相应打开文件所在的目录*/int count; /*读写指针在文件中的位置*/char fcbstate; /*是否修改了文件的FCB内容,修改置1,否则为0*/char topenfile; /*表示该用户打开的表项是否为空,若值为0,表示为空*/}useropen;typedef struct BLOCK0{unsigned short fbnum;char information[200];unsigned short root;unsigned char *startblock;}block0;/*全局变量定义*/unsigned char *myvhard; /*指向虚拟磁盘的起始地址*/useropen openfilelist[MAX_OPEN_FILE]; /*用户打开文件表数组*/useropen *ptrcurdir; /*指向用户打开文件表中的当前目录所在打开文件表项的位置*/ int curfd;char currentdir[80]; /*记录当前目录的文件名*/unsigned char *startp; /*记录虚拟磁盘上数据区开始位置*/char filename[]="c:\\myfilesys"; /*虚拟空间保存路径*/unsigned char buffer[SIZE];/*函数声明*/void startsys();void my_for mat();void my_cd(char *dirname);void my_mkdir(char *dirname);void my_rmdir(char *dir name);void my_ls();void my_create(char *filename);void my_rm(char *filename);int my_open(char *filename);int my_close(int fd);int my_wr ite(int fd);int do_write(int fd,char *text,int len,char wstyle);unsigned short findFree();int my_read(int fd,int len);int do_read(int fd,int len,char *text);void my_exitsys();/*函数设计*//*文件系统初始化*//*原型声明: void startsys()功能描述:文件系统初始化,初始化所建立的文件系统输入:无输出:无函数功能实现算法描述:1)申请磁盘空间2)打开系统磁盘,若不存在,创建新的系统磁盘,并格式化3)初始化用户打开文件表,将表项0分配给根目录文件使用并填写根目录文件的相关信息4)将ptrcurdir指向该用户打开文件表项5)将当前目录设置为根目录*/void startsys(){FILE *fp;int i;myvhard=(unsigned char *)malloc(SIZE);memset(myvhard,0,SIZE);fp=fopen(filename,"r");if(fp){fread(buffer,SIZE,1,fp);fclose(fp);if(buffer[0]!=0xaa||buffer[1]!=0xaa){printf("myfilesys is not exist,begin to creat the file...\n");my_for mat();}else{for(i=0;i<SIZE;i++)myvhard[i]=buffer[i];}}else{printf("myfilesys is not exist,begin to creat the file...\n");my_for mat();}strcpy(openfilelist[0].filename,"root");strcpy(openfilelist[0].exname,"di");openfilelist[0].attribute=0x2d;openfilelist[0].time=((fcb *)(myvhard+5*BLOCKSIZE))->time;openfilelist[0].date=((fcb *)(myvhard+5*BLOC KSIZE))->date;openfilelist[0].first=((fcb *)(myvhard+5*BLOCKSIZE))->first;openfilelist[0].length=((fcb *)(myvhard+5*BLOCKSIZE))->length; openfilelist[0].free=1;openfilelist[0].dirno=5;openfilelist[0].diroff=0;openfilelist[0].count=0;openfilelist[0].fcbstate=0;openfilelist[0].topenfile=0;openfilelist[0].father=0;memset(currentdir,0,sizeof(currentdir));strcpy(currentdir,"\\root\\");strcpy(openfilelist->dir[0],currentdir);startp=((block0 *)myvhard)->startblock;ptrcurdir=&openfilelist[0];curfd=0;}/*原型声明: void my_for mat()功能描述:对虚拟磁盘进行格式化,布局虚拟磁盘,建立根目录文件输入:无输出:无函数功能实现算法描述:虚拟磁盘空间布局1块2块2块995块引导块FAT1 FAT2 数据区虚拟磁盘一共划分成1000个磁盘块每块1024个字节,磁盘空间布局如上将数据区的第一块(即虚拟磁盘的第6块)分配给根目录文件*/void my_for mat(){FILE *fp;fat *fat1,*fat2;block0 *b0;time_t *now;struct tm *nowtime;unsigned char *p;fcb *root;int i;p=myvhard;b0=(block0 *)p;fat1=(fat *)(p+BLOCKSIZE);fat2=(fat*)(p+3*BLOCKSIZE);/*引导块*/b0->fbnum=0xaaaa; /*文件系统魔数10101010*/b0->root = 5;strcpy(b0->information,"My FileSystem Ver 1.0 \n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2\n");/*FAT1,FAT2前面五个磁盘块已分配,标记为END*/fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;fat1->id=6;fat2->id=6;fat1++;fat2++;fat1->id=END;fat2->id=END;fat1++;fat2++;/*将数据区的标记为空闲状态*/for(i=7;i<SIZE/BLOC KSIZE;i++){(*fat1).id=FREE;(*fat2).id=FREE;fat1++;fat2++;}/*创建根目录文件root,将数据区的第一块分配给根目录区在给磁盘上创建两个特殊的目录项:".","..",除了文件名之外,其它都相同*/p+=BLOCKSIZE*5;root=(fcb *)p;strcpy(root->filename,".");strcpy(root->exname,"di");root->attr ibute=40;now=(time_t *)malloc(sizeof(time_t));time(now);nowtime=localtime(now);root->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday; root->first=5;root->length=2*sizeof(fcb);root++;strcpy(root->filename,"..");strcpy(root->exname,"di");root->attr ibute=40;time(now);nowtime=localtime(now);root->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday; root->first=5;root->length=2*sizeof(fcb);root++;for(i=2;i<BLOC KSIZE*2/sizeof(fcb);i++,root++){root->filename[0]='\0';}fp=fopen(filename,"w");b0->startblock=p+BLOCKSIZE*4;fwrite(myvhard,SIZE,1,fp);free(now);fclose(fp);}/**//*原型声明: void my_exitsys()功能描述:退出文件系统输入:无输出:无函数功能实现算法描述:*/void my_exitsys(){FILE *fp;fcb *rootfcb;char text[MAX_TXT_SIZE];while(curfd)curfd=my_close(curfd);if(openfilelist[curfd].fcbstate){openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);rootfcb=(char *)text;rootfcb->length=openfilelist[curfd].length;openfilelist[curfd].count=0;do_write(curfd,text,openfilelist[curfd].length,2);}fp=fopen(filename,"w");fwrite(myvhard,SIZE,1,fp);free(myvhard);fclose(fp);}/*原型声明: int do_read(int fd,int len,char *text)功能描述:实际读文件函数,读出指定文件中从指定指针开始的长度为len的内容到用户空间的text中输入:fd open()函数的返回值,文件的描述符len 要求从文件中读出的字节数text 指向存放读出数据的用户区地址输出:实际读出的字节数函数功能实现算法描述:*/int do_read(int fd,int len,char *text){unsigned char *buf;unsigned short bknum;int off,i,lentmp;unsigned char *bkptr;char *txtmp,*p;fat *fat1,*fatptr;fat1=(fat *)(myvhard+BLOC KSIZE);lentmp = len;txtmp=text;/*申请1024B空间作为缓冲区buffer*/buf=(unsigned char *)malloc(1024);if(buf==NULL){printf("malloc failed!\n");return -1;}off = openfilelist[fd].count;bknum = openfilelist[fd].first;fatptr = fat1+bknum;while(off >= BLOC KSIZE){off=off-BLOCKSIZE;bknum=fatptr->id;fatptr=fat1+bknum;if(bknum == END){printf("Error,the block is not exist.\n");return -1;}}bkptr=(unsigned char *)(myvhard+bknum*BLOCKSIZE);//strncpy(buf,bkptr,BLOCKSIZE);for(i=0;i<BLOC KSIZE;i++){buf[i]=bkptr[i];}while(len > 0){if(BLOCKSIZE-off > len){//strncpy(txtmp,buf+off,len);//len=len-len;//openfilelist[fd].count+=len;//off+=len;for(p=buf+off;len>0;p++,txtmp++){*txtmp=*p;len--;off++;openfilelist[fd].count++;}}else{//strncpy(txtmp,buf+off,BLOCKSIZE-off);//len=len-(BLOCKSIZE-off);//openfilelist[fd].count+=(BLOCKSIZE-off);for(p=buf+off;p<buf+BLOCKSIZE;p++,txtmp++){*txtmp=*p;len--;openfilelist[fd].count++;}off=0;//txtmp+=(BLOCKSIZE-off);bknum =fatptr->id;fatptr = fat1+bknum;bkptr=(unsigned char *)(myvhard+bknum*BLOCKSIZE);//strncpy(buf,bkptr,BLOCKSIZE);for(i=0;i<BLOC KSIZE;i++){buf[i]=bkptr[i];}}}free(buf);return lentmp-len;}/**//*原型声明: int my_read(int fd,int len) 功能描述:读文件函数输入:fd 打开文件的idlen 要读出字符的个数输出:返回实际读的字符的个数函数功能实现算法描述:*/int my_read(int fd,int len){char text[MAX_TXT_SIZE];if(fd > MAX_OPEN_FILE){printf("The File is not exist!\n");return -1;}openfilelist[curfd].count=0;if(do_read(fd,len,text)>0){text[len]='\0';printf("%s\n",text);}else{printf("Read Error!\n");return -1;}return len;}/**//*原型声明: int do_write(int fd,char *text,int len,char wstyle) 功能描述:实际写文件函数输入:fd 当前打开的文件的idtext 指向要写入的内容的指针len 本次要写入字节数wstyle写方式输出:实际写入的字节数函数功能实现算法描述:*/int do_write(int fd,char *text,int len,char wstyle){unsigned char *buf;unsigned short bknum;int off,tmplen=0,tmplen2=0,i,rwptr;unsigned char *bkptr,*p;char *txtmp,flag=0;fat *fat1,*fatptr;fat1=(fat *)(myvhard+BLOC KSIZE);txtmp=text;/*申请临时1024B的buffer*/buf=(unsigned char *)malloc(BLOCKSIZE);if(buf==NULL){printf("malloc failed!\n");return -1;}rwptr = off = openfilelist[fd].count;bknum = openfilelist[fd].first;fatptr=fat1+bknum;while(off >= BLOC KSIZE ){off=off-BLOCKSIZE;bknum=fatptr->id;if(bknum == END){bknum=fatptr->id=findFree();if(bknum==END) retur n -1;fatptr=fat1+bknum;fatptr->id=END;}fatptr=fat1+bknum;}fatptr->id=END;bkptr=(unsigned char *)(myvhard+bknum*BLOCKSIZE); while(tmplen<len){for(i=0;i<BLOC KSIZE;i++){buf[i]=0;}//if(off)//{for(i=0;i<BLOC KSIZE;i++){buf[i]=bkptr[i];tmplen2++;if(tmplen2==openfilelist[curfd].length)break;}//}//else//{//for(i=0;i<BLOCKSIZE;i++)//{// buf[i]=0;//}//}for(p=buf+off;p<buf+BLOCKSIZE;p++){*p=*txtmp;tmplen++;txtmp++;off++;if(tmplen==len)break;/*if((*p)==NULL){break;}*/}for(i=0;i<BLOC KSIZE;i++){bkptr[i]=buf[i];}openfilelist[fd].count=rwptr+tmplen;if(off>=BLOCKSIZE){off=off-BLOCKSIZE;bknum=fatptr->id;if(bknum==END){bknum=fatptr->id=findFree();if(bknum==END) retur n -1;fatptr=fat1+bknum;fatptr->id=END;}fatptr=fat1+bknum;bkptr=(unsigned char *)(myvhard+bknum*BLOCKSIZE);}}free(buf);if(openfilelist[fd].count>openfilelist[fd].length){openfilelist[fd].length=openfilelist[fd].count;}openfilelist[fd].fcbstate=1;return tmplen;}/**//*原型声明: unsigned short findFree()功能描述:寻找下一个空闲盘块输入:无输出:返回空闲盘块的id函数功能实现算法描述:*/unsigned short findFree(){unsigned short i;fat *fat1,*fatptr;fat1=(fat *)(myvhard+BLOC KSIZE);for(i=6; i<END; i++){fatptr=fat1+i;if(fatptr->id == FREE){return i;}}printf("Error,Can't find free block!\n"); return END;}/*原型声明: int findFreeO()功能描述:寻找空闲文件表项输入:无输出:返回空闲文件表项的id 函数功能实现算法描述:*/int findFreeO(){int i;for(i=0;i<MAX_OPEN_FILE;i++){if(openfilelist[i].free==0){return i;}}printf("Error,open too many files!\n"); return -1;}/**//*原型声明: int my_wr ite(int fd)功能描述:写文件函数输入:fd 打开文件的id输出:返回实际写的长度函数功能实现算法描述:*/int my_wr ite(int fd){int wstyle=0,wlen=0;fat *fat1,*fatptr;unsigned short bknum;unsigned char *bkptr;char text[MAX_TXT_SIZE];fat1=(fat *)(myvhard+BLOC KSIZE);if(fd>MAX_OPEN_FILE){printf("The file is not exist!\n");return -1;}while(wstyle<1||wstyle>3){printf("Please enter the number of wr ite style:\n1.cut wr ite\t2.cover write\t3.add write\n");scanf("%d",&wstyle);getchar();switch(wstyle){case 1://截断写{bknum=openfilelist[fd].first;fatptr=fat1+bknum;while(fatptr->id!=END){bknum=fatptr->id;fatptr->id=FREE;fatptr=fat1+bknum;}fatptr->id=FREE;bknum=openfilelist[fd].first;fatptr=fat1+bknum;fatptr->id=END;openfilelist[fd].length=0;openfilelist[fd].count=0;break;}case 2://覆盖写{openfilelist[fd].count=0;break;}case 3://追加写{bknum=openfilelist[fd].first;fatptr=fat1+bknum;openfilelist[fd].count=0;while(fatptr->id!=END){bknum=fatptr->id;fatptr=fat1+bknum;openfilelist[fd].count+=BLOCKSIZE;}bkptr=(unsigned char *)(myvhard+bknum*BLOCKSIZE);while(*bkptr !=0){bkptr++;openfilelist[fd].count++;}break;}default:break;}}printf("please input write data:\n");gets(text);if(do_write(fd,text,str len(text),wstyle)>0){wlen+=strlen(text);}else{return -1;}if(openfilelist[fd].count>openfilelist[fd].length){openfilelist[fd].length=openfilelist[fd].count;}openfilelist[fd].fcbstate=1;return w len;}/*原型声明: void my_mkdir(char *dirname)功能描述:创建子目录函数,在当前目录下创建名为dirname的目录输入:dirname 指向新建目录的名字的指针输出:无函数功能实现算法描述:*/void my_mkdir(char *dirname){fcb *dirfcb,*pcbtmp;int rbn,i,fd;unsigned short bknum;char text[MAX_TXT_SIZE],*p;time_t *now;struct tm *nowtime;/*将当前的文件信息读到text中rbn 是实际读取的字节数*/openfilelist[curfd].count=0;rbn = do_read(curfd,openfilelist[curfd].length,text);dirfcb=(fcb *)text;/*检测是否有相同的目录名*/for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(dirname,dirfcb->filename)==0){printf("Error,the dirname is alr eady exist!\n");return -1;}dirfcb++;}/*分配一个空闲的打开文件表项*/dirfcb=(fcb *)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(dirfcb->filename,"")==0)break;dirfcb++;}openfilelist[curfd].count=i*sizeof(fcb);fd=findFreeO();if(fd<0){return -1;}/*寻找空闲盘块*/bknum = findFree();if(bknum == END ){return -1;}pcbtmp=(fcb *)malloc(sizeof(fcb));now=(time_t *)malloc(sizeof(time_t));//在当前目录下新建目录项pcbtmp->attribute=0x30;time(now);nowtime=localtime(now);pcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2; pcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday; strcpy(pcbtmp->filename,dirname);strcpy(pcbtmp->exname,"di");pcbtmp->first=bknum;pcbtmp->length=2*sizeof(fcb);openfilelist[fd].attribute=pcbtmp->attribute;openfilelist[fd].count=0;openfilelist[fd].date=pcbtmp->date;strcpy(openfilelist[fd].dir[fd],openfilelist[curfd].dir[curfd]);p=openfilelist[fd].dir[fd];while(*p!='\0')p++;strcpy(p,dirname);while(*p!='\0') p++;*p='\\';p++;*p='\0';openfilelist[fd].dirno=openfilelist[curfd].first;openfilelist[fd].diroff=i;strcpy(openfilelist[fd].exname,pcbtmp->exname);strcpy(openfilelist[fd].filename,pcbtmp->filename);openfilelist[fd].fcbstate=1;openfilelist[fd].first=pcbtmp->first;openfilelist[fd].length=pcbtmp->length;openfilelist[fd].free=1;openfilelist[fd].time=pcbtmp->time;openfilelist[fd].topenfile=1;do_write(curfd,(char *)pcbtmp,sizeof(fcb),2);pcbtmp->attribute=0x28;time(now);nowtime=localtime(now);pcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2; pcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday; strcpy(pcbtmp->filename,".");strcpy(pcbtmp->exname,"di");pcbtmp->first=bknum;pcbtmp->length=2*sizeof(fcb);do_write(fd,(char *)pcbtmp,sizeof(fcb),2);pcbtmp->attribute=0x28;time(now);nowtime=localtime(now);pcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2; pcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday; strcpy(pcbtmp->filename,"..");strcpy(pcbtmp->exname,"di");pcbtmp->first=openfilelist[curfd].first;pcbtmp->length=openfilelist[curfd].length;do_write(fd,(char *)pcbtmp,sizeof(fcb),2);openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);pcbtmp=(fcb *)text;pcbtmp->length=openfilelist[curfd].length;my_close(fd);openfilelist[curfd].count=0;do_write(curfd,text,pcbtmp->length,2);}/**//*原型声明: void my_ls()功能描述:显示目录函数输入:无输出:无函数功能实现算法描述:*/void my_ls(){fcb *fcbptr;int i;char text[MAX_TXT_SIZE];unsigned short bknum;openfilelist[curfd].count=0;do_read(curfd,openfilelist[curfd].length,text);fcbptr=(fcb *)text;for(i=0;i<(int)(openfilelist[curfd].length/sizeof(fcb));i++){if(fcbptr->filename[0]!='\0'){if(fcbptr->attr ibute&0x20){printf("%s\\\t\t<DIR>\t\t%d/%d/%d\t%02d:%02d:%02d\n",fcbptr->filename,((fcbptr->date)>>9)+1980,((fcbptr->date)>>5) &0x000f,(fcbptr->date)&0x001f,fcbptr->time>>11,(fcbptr->time>>5)&0x003f,fcbptr->time&0x001f*2);}else{printf("%s.%s\t\t%dB\t\t%d/%d/%d\t%02d:%02d:%02d\t\n",fcbptr->filename,fcbptr->exname,fcbptr->length,((fcbptr->da te)>>9)+1980,(fcbptr->date>>5)&0x000f,fcbptr->date&0x1f,fcbptr->time>>11,(fcbptr->time>>5)&0x3f,fcbptr->time&0x1f*2);}}fcbptr++;}openfilelist[curfd].count=0;}/**//*原型声明: void my_rmdir(char *dir name)功能描述:删除子目录函数输入:dirname 指向新建目录的名字的指针输出:无函数功能实现算法描述:*/void my_rmdir(char *dir name){int rbn,fd;char text[MAX_TXT_SIZE];fcb *fcbptr,*fcbtmp,*fcbtmp2;unsigned short bknum;int i,j;fat *fat1,*fatptr;if(strcmp(dirname,".")==0 || strcmp(dirname,"..")==0) {printf("Error,can't remove this directory.\n");return -1;}fat1=(fat *)(myvhard+BLOC KSIZE);openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text); fcbptr=(fcb *)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(dirname,fcbptr->filename)==0){break;}fcbptr++;}if(i >= rbn/sizeof(fcb)){printf("Error,the directory is not exist.\n");return -1;}bknum=fcbptr->first;fcbtmp2=fcbtmp=(fcb *)(myvhard+bknum*BLOCKSIZE);for(j=0;j<fcbtmp->length/sizeof(fcb);j++){if(strcmp(fcbtmp2->filename,".") && strcmp(fcbtmp2->filename,"..") && fcbtmp2->filename[0]!='\0') {printf("Error,the directory is not empty.\n");return -1;}fcbtmp2++;}while(bknum!=END){fatptr=fat1+bknum;bknum=fatptr->id;fatptr->id=FREE;}strcpy(fcbptr->filename,"");strcpy(fcbptr->exname,"");fcbptr->first=END;openfilelist[curfd].count=0;do_write(curfd,text,openfilelist[curfd].length,2);}/*原型声明: int my_open(char *filename)功能描述:打开文件函数输入:filename 指向要打开的文件的名字的指针输出:返回打开的文件的id函数功能实现算法描述:*/int my_open(char *filename){int i,fd,rbn;char text[MAX_TXT_SIZE],*p,*fname,*exname;fcb *fcbptr;char exnamed=0;fname=strtok(filename,".");exname=strtok(NULL,".");if(!exname){exname=(char *)malloc(3);strcpy(exname,"di");exnamed=1;}for(i=0;i<MAX_OPEN_FILE;i++){if(strcmp(openfilelist[i].filename,filename)==0 &&strcmp(openfilelist[i].exname,exname)==0&& i!=curfd) {printf("Error,the file is already open.\n");return -1;}}openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);fcbptr=(fcb *)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(filename,fcbptr->filename)==0 && strcmp(fcbptr->exname,exname)==0){break;}fcbptr++;}if(i>=rbn/sizeof(fcb)){printf("Error,the file is not exist.\n");return curfd;}if(exnamed){free(exname);}fd=findFreeO();if(fd==-1){return -1;}strcpy(openfilelist[fd].filename,fcbptr->filename); strcpy(openfilelist[fd].exname,fcbptr->exname); openfilelist[fd].attribute=fcbptr->attribute;openfilelist[fd].count=0;openfilelist[fd].date=fcbptr->date;openfilelist[fd].first=fcbptr->first;openfilelist[fd].length=fcbptr->length;openfilelist[fd].time=fcbptr->time;openfilelist[fd].father=curfd;openfilelist[fd].dirno=openfilelist[curfd].first; openfilelist[fd].diroff=i;openfilelist[fd].fcbstate=0;openfilelist[fd].free=1;openfilelist[fd].topenfile=1;strcpy(openfilelist[fd].dir[fd],openfilelist[curfd].dir[curfd]); p=openfilelist[fd].dir[fd];while(*p!='\0')p++;strcpy(p,filename);while(*p!='\0') p++;if(openfilelist[fd].attribute&0x20){*p='\\';p++; *p='\0';}else{*p='.';p++;strcpy(p,openfilelist[fd].exname);}return fd;}/**//*原型声明: int my_close(int fd)功能描述:关闭文件函数输入:fd 打开文件的id输出:返回fd的father的id函数功能实现算法描述:*/int my_close(int fd){fcb *fafcb;char text[MAX_TXT_SIZE];int fa;/*检查fd的有效性*/if(fd > MAX_OPEN_FILE || fd<=0){printf("Error,the file is not exist.\n");return -1;}fa=openfilelist[fd].father;if(openfilelist[fd].fcbstate){fa=openfilelist[fd].father;openfilelist[fa].count=0;do_read(fa,openfilelist[fa].length,text);fafcb=(fcb *)(text+sizeof(fcb)*openfilelist[fd].diroff);fafcb->attribute=openfilelist[fd].attr ibute;fafcb->date=openfilelist[fd].date;fafcb->first=openfilelist[fd].first;fafcb->length=openfilelist[fd].length;fafcb->time=openfilelist[fd].time;strcpy(fafcb->filename,openfilelist[fd].filename);strcpy(fafcb->exname,openfilelist[fd].exname);openfilelist[fa].count=0;do_write(fa,text,openfilelist[fa].length,2);}openfilelist[fd].attribute=0;openfilelist[fd].count=0;openfilelist[fd].date=0;strcpy(openfilelist[fd].dir[fd],"");strcpy(openfilelist[fd].filename,"");strcpy(openfilelist[fd].exname,"");openfilelist[fd].length=0;openfilelist[fd].time=0;openfilelist[fd].free=0;openfilelist[fd].topenfile=0;return fa;}/**//*原型声明: void my_cd(char *dirname) 功能描述:更改当前目录函数输入:dirname 指向目录名的指针输出:无函数功能实现算法描述:*/void my_cd(char *dirname){char *p,text[MAX_TXT_SIZE];int fd,i;p=strtok(dirname,"\\");if(strcmp(p,".")==0)return;if(strcmp(p,"..")==0){fd=openfilelist[curfd].father;my_close(curfd);curfd=fd;ptrcurdir=&openfilelist[curfd];return;}if(strcmp(p,"r oot")==0){for(i=1;i<MAX_OPEN_FILE;i++){if(openfilelist[i].free)my_close(i);}ptrcurdir=&openfilelist[0];curfd=0;p=strtok(NULL,"\\");}while(p){fd=my_open(p);if(fd>0){ptrcurdir=&openfilelist[fd];curfd=fd;}elsereturn -1;p=strtok(NULL,"\\");}}/**//*原型声明: void my_create(char *filename)功能描述:创建文件函数输入:filename 指向文件名的指针输出:无函数功能实现算法描述:*/void my_create(char *filename){char *fname,*exname,text[MAX_TXT_SIZE];int fd,rbn,i;fcb *filefcb,*fcbtmp;time_t *now;struct tm *nowtime;unsigned short bknum;fat *fat1,*fatptr;fat1=(fat *)(myvhard+BLOC KSIZE);fname=strtok(filename,".");exname=strtok(NULL,".");if(strcmp(fname,"")==0){printf("Error,creating file must have a right name.\n");return -1;}if(!exname){printf("Error,creating file must have a extern name.\n");return -1;}openfilelist[curfd].count=0;rbn=do_read(curfd,openfilelist[curfd].length,text);filefcb=(fcb *)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(fname,filefcb->filename)==0 && strcmp(exname,filefcb->exname)==0){printf("Error,the filename is already exist!\n");return -1;}filefcb++;}filefcb=(fcb *)text;for(i=0;i<rbn/sizeof(fcb);i++){if(strcmp(filefcb->filename,"")==0)break;filefcb++;}openfilelist[curfd].count=i*sizeof(fcb);bknum=findFree();if(bknum==END){return -1;}fcbtmp=(fcb *)malloc(sizeof(fcb));now=(time_t *)malloc(sizeof(time_t));fcbtmp->attribute=0x00;time(now);nowtime=localtime(now);fcbtmp->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;fcbtmp->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday; strcpy(fcbtmp->filename,fname);。

文件系统模拟实验(C-实验教材)

文件系统模拟实验(C-实验教材)

文件系统实验1.1实验目的和要求1.1.1实验目的通常把文件与管理信息资源的管理程序的集合称为文件系统,它是操作系统中负责存取和管理信息资源的模块,采用统一的方法管理用户信息和系统信息的存储、检索、更新、共享和保护,并为用户提供一套行之有效的文件使用及操作方法。

本实验利用高级语言编写程序模拟文件系统,了解文件系统的基本结构和文件的各种操作方法,加深理解文件系统的内部功能及内部实现,从而帮助学生对各种文件操作命令的实质内容和执行过程有比较深入的了解。

1.1.2实验要求1.采用高级语言编写程序模拟文件系统,文件系统采用多级目录结构,实现对文件和目录的创建、删除、重命名、变更权限、显示文件内容、修改文件内容等操作。

2.撰写实验报告,报告应包含以下内容:(1)实验目的;(2)实验内容;(3)设计思路;(4)程序流程图;(5)程序中主要数据结构和函数说明;(6)带注释的源程序代码;(7)程序运行结果及分析(8)实验收获与体会1.2预备知识1.2.1文件和文件系统1.文件概念现代计算机系统中都配置了外存,大量的程序和数据以文件的形式存放在外存。

如果由用户直接管理文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且多用户环境下还必须能保持数据的安全性和一致性,这是用户不能胜任的。

因而,现代操作系统中都配备文件系统,以适应系统资源管理和用户使用信息的需要。

文件是指由创建者所定义的、具有文件名的一组相关元素的集合。

用户通过文件名就可对文件进行访问,文件名是由字母或数字组成的字母或数字串,其格式和长度都因系统而异。

操作系统提供文件系统的优点有:(1)便于用户使用。

(2)文件安全可靠。

(3)系统能有效利用存储空间,优化安排不同属主文件的位置。

(4)文件系统还能提供文件共享功能。

2.文件命名在不同的操作系统中对文件名的规定有所不同,文件名的格式和长度因系统而异。

一般来说,文件名由文件名和扩展名两部分组成,前者用于标识文件,后者用于区分文件类型,中间用“.”分割开来,它们都是字母或数字所组成的字母数字串。

文件系统课程设计

文件系统课程设计

文件系统课程设计一、教学目标本课程的教学目标是让学生掌握文件系统的基本概念、原理和操作方法。

具体包括:1.知识目标:了解文件系统的定义、作用和基本组成;掌握文件的基本概念和分类;理解文件系统的和存储原理;熟悉文件系统的访问和操作方法。

2.技能目标:能够使用操作系统进行文件创建、删除、复制、移动、重命名等基本操作;掌握文件权限设置和安全管理方法;了解文件系统的优化和维护技巧。

3.情感态度价值观目标:培养学生对文件系统的安全意识,使其能够正确使用文件系统,保护个人和国家的信息安全;培养学生对文件系统的热爱和责任感,使其能够积极参与文件系统的维护和优化。

二、教学内容本课程的教学内容主要包括以下几个部分:1.文件系统概述:介绍文件系统的定义、作用和基本组成,使学生了解文件系统的重要性。

2.文件的基本概念:讲解文件的概念、分类和文件名的命名规则,让学生掌握文件的基本知识。

3.文件系统的和存储原理:介绍文件系统的和存储方式,如顺序存储、索引存储和链接存储等,使学生了解文件系统是如何存储和管理文件的。

4.文件系统的访问和操作:讲解文件系统的访问和操作方法,包括文件的创建、删除、复制、移动、重命名等基本操作,让学生学会如何使用文件系统。

5.文件权限和管理:介绍文件权限设置和安全管理方法,使学生了解如何保护文件的安全。

6.文件系统的优化和维护:讲解文件系统的优化和维护技巧,如文件系统的清理、整理和压缩等,让学生掌握文件系统的维护方法。

三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:通过讲解文件系统的基本概念、原理和操作方法,使学生掌握文件系统的知识。

2.案例分析法:通过分析实际案例,让学生了解文件系统的应用场景和实际操作。

3.实验法:安排实验课,让学生亲自动手操作文件系统,提高其实际操作能力。

4.讨论法:学生进行课堂讨论,培养学生的思考能力和团队协作精神。

四、教学资源本课程所需的教学资源包括:1.教材:选用权威、实用的教材,为学生提供系统的文件系统知识。

简单的文件系统课程设计

简单的文件系统课程设计

简单的文件系统课程设计一、课程目标知识目标:1. 学生能够理解文件系统的基本概念,掌握文件、文件夹的创建、删除、复制、移动等基本操作。

2. 学生能够了解简单文件系统的结构,掌握文件的存储、读取、写入等过程。

3. 学生能够掌握文件权限和文件属性的概念,了解如何保护文件安全。

技能目标:1. 学生能够熟练使用文件管理器,对文件和文件夹进行有效管理。

2. 学生能够编写简单的程序,实现对文件的基本操作,如读写、复制等。

3. 学生能够运用所学知识,解决实际生活中遇到的文件管理问题。

情感态度价值观目标:1. 培养学生良好的文件管理习惯,提高信息素养,增强信息处理能力。

2. 培养学生的团队协作意识,学会在合作中分享和交流文件资源。

3. 增强学生的网络安全意识,尊重知识产权,遵循法律法规。

本课程针对五年级学生设计,结合学生好奇心强、动手能力强、善于合作等特点,注重理论与实践相结合,让学生在实际操作中掌握文件系统知识。

课程目标具体、可衡量,便于教学设计和评估,有助于提高学生的信息素养和实际操作能力。

二、教学内容1. 文件系统基本概念:文件、文件夹、路径、文件类型等。

2. 文件管理基本操作:创建、删除、复制、移动、重命名文件和文件夹。

3. 文件系统结构:磁盘分区、目录结构、文件存储方式。

4. 文件读写过程:文件的打开、读取、写入、关闭。

5. 文件权限与属性:设置文件权限,了解文件属性的作用。

6. 文件管理器的使用:熟悉文件管理器的界面和功能,提高文件管理效率。

7. 简单文件操作编程:使用编程语言实现文件的创建、读写、删除等操作。

8. 文件共享与安全:文件共享的方法,文件加密、解密,保护文件安全。

教学内容根据以下教材章节组织:第一章:计算机系统概述第二节:文件系统基本概念第三节:文件管理基本操作第二章:文件系统第一节:文件系统结构第二节:文件读写过程第三节:文件权限与属性第三章:文件管理与应用第一节:文件管理器的使用第二节:简单文件操作编程第三节:文件共享与安全教学进度安排:共8课时,每课时40分钟。

W5 实验五 文件系统制作实验

W5 实验五 文件系统制作实验

实验五 嵌入式文件系统的构建【实验目的】1、了解嵌入式操作系统中文件系统的类型和作用 2、了解 JFFS2 文件系统的优点及其在嵌入式系统中的作用 3、掌握利用 BusyBox 软件制作嵌入式文件系统的方法 4、掌握嵌入式 Linux 文件系统的的挂载过程【实验原理】1、Linux 文件系统的类型 (1) 、EXT 文件系统 Ext2fs 是 Linux 的标准文件系统,它已经取代了扩展文件系统(或 Extfs) 。

扩展文件系 统 Extfs 支持的文件大小最大为 2 GB, 支持的最大文件名称大小为 255 个字符, 而且它不支 持索引节点(包括数据修改时间标记) 。

Ext2fs 取代 Extfs 具有一些优点:  Ext2fs 支持达 4 TB 的内存。

 Ext2fs 文件名称最长可以到 1012 个字符。

 在创建文件系统时,管理员可以根据需要选择存储逻辑块的大小(通常大小可选择 1024、2048 和 4096 字节) 。

 Ext2fs 可以实现快速符号链接(相当 windows 文件系统的快捷方式) ,不需为符号链接 分配数据块,并且可将目标名称直接存储在索引节点(inode)表中。

这使文件系统的 性能有所提高,特别在访问速度上。

由于 Ext2fs 文件系统的稳定性、可靠性和健壮性,所以几乎在所有基于 Linux 的系统 (包括台式机、服务器和工作站,并且甚至一些嵌入式设备)上都使用 Ext2fs 文件系统。

(2) 、NFS 文件系统 NFS 是一个 RPC service ,它是由 SUN 公司开发,并于 1984 年推出。

NFS 文件系统能 够使文件实现共享,它的设计是为了在不同的系统之间使用,所以 NFS 文件系统的通信协 议设计与作业系统无关。

当使用者想使用远端文件时只要用“mount”命令就可以把远端文 件系统挂载在自己的文件系统上,使远端的文件在使用上和本地机器的文件没有区别。

操作系统实验5文件系统:Linux文件管理

操作系统实验5文件系统:Linux文件管理

实验5 文件系统: Linux文件管理1. 实验目的〔1〕掌握Linux提供的文件系统调用的使用方法;〔2〕熟悉文件和目录操作的系统调用用户接口;〔3〕了解操作系统文件系统的工作原理和工作方式。

2. 实验内容〔1〕利用Linux有关系统调用函数编写一个文件工具filetools, 要求具有下列功能:***********0.退出1.创建新文件2.写文件3.读文件4.复制文件5.修改文件权限6.查看文件权限7.创建子目录8.删除子目录9.改变当前目录到指定目录10.操作***********代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#include<syslog.h>#include<string.h>#include<stdlib.h>void menu(void);void openfile(void);void writefile(void);void readfile(void);void copyfile(void);void chmd(void);void ckqx(void);void cjml(void);void scml(void);void ggml(void);void ylj(void);int main(){int choose;int suliangjin=1;menu();scanf("%d",&choose);while(choose!=0){switch(choose){case 1:openfile();break;case 2:writefile();break;case 3:readfile();break;case 4:copyfile();break;case 5:chmd();break;case 6:ckqx();break;case 7:cjml();break;case 8:scml();break;case 9:ggml();break;case 10:ylj();break;}menu();scanf("%d",&choose);}return 0;}void menu(void){printf("文件系统\n");printf("1.创建新文件\n");printf("2.写文件\n");printf("3.读文件\n");printf("4.复制文件\n");printf("5.修改文件权限\n");printf("6.查看文件权限\n");printf("7.创建子目录\n");printf("8.删除子目录\n");printf("9.改变目前目录到指定目录\n");printf("10.操作\n");printf("0.退出\n");printf("请输入您的选择...\n");}void openfile(void){int fd;if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");elseprintf("open file:hileo.c %d\n",fd);if(close(fd)<0)perror("close");elseprintf("Close hello.c\n");}void writefile(void){int fd,size,len;char *buf="Hello!I'm writing to this file!";len=strlen(buf);if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");elseprintf("open file:hileo.c %d\n",fd);if((size=write(fd,buf,len))<0)perror("write");elseprintf("Write:%s\n",buf);if(close(fd)<0)perror("close");elseprintf("Close hello.c \n");}void readfile(void){int fd,size;char b[10];if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");elseprintf("open file:hileo.c %d\n",fd);lseek(fd,0,SEEK_SET);if((size=read(fd,b,10))<0)perror("read");elseprintf("read from file:%s\n",b);if(close(fd)<0)perror("close");elseprintf("Close hello.c\n");}void copyfile(void){if(fork()==0)execlp("/bin/cp","cp","/tmp/hello.c","/tmp/he.c",NULL);elsewait(0);printf("将hello.c复制he.c");}void chmd(void){int a;printf("1.文件主可读可写可执行\n");printf("2.文件主可读\n");printf("3.文件主可写\n");printf("4.文件主可执行\n");printf("请输入您的选项\n");scanf("%d",&a);switch(a){case 1:chmod("/tmp/hello.c",S_IRWXU);printf("ok!\n");break;case 2:chmod("/tmp/hello.c",S_IRUSR);printf("ok!\n");break;case 3:chmod("/tmp/hello.c",S_IWUSR);printf("ok!\n");break;case 4:chmod("/tmp/hello.c",S_IXUSR);printf("ok!\n");break;default:printf("您选择有误\n");}}void ckqx(void){char *path="/bin/ls";char *argv[4]={"ls","-l",NULL};if(fork()==0)execv(path,argv);elsewait(0);}void cjml(void){if(mkdir("/tmp/a",S_IRWXU)<0)perror("Mkdir");elseprintf("创建成功\n");}void scml(void){if(rmdir("/tmp/a")<0)perror("Rmdir");elseprintf("删除成功\n");}void ggml(void){if(chdir("/tmp/bc")<0)perror("chdir");elseprintf("更改目录成功\n"); }void ylj(void){if(link("hello.c","h.c")<0)perror("Link");elseprintf("建立硬连接\n"); }打开文件:写文件:读文件:复制文件: 修改权限: 查看权限:创建目录:删除目录:更改目录:硬连接:1.问题解决方案:在复制文件时用execlp函数, 虽然有复制成功但是他就跳出整个程序, 这就是一个缺陷。

文件系统设计

文件系统设计

else if(strcmp(choice,"modify")==0) choice1=8; else if(strcmp(choice,"exit")==0) choice1=9; else if(strcmp(choice,"cls")==0) choice1=10; else if(strcmp(choice,"cd")==0) choice1=11; else if(strcmp(choice,"help")==0) choice1=20; else choice1=12; switch(choice1) {case 1:DirF();choiceend=1;break; case 2:CreateF();choiceend=1;if(!wgetchar) getchar();break; case 3:DeleteF();choiceend=1;if(!wgetchar)getchar();break; case 4:ModifyFM();choiceend=1;if(!wgetchar) getchar();break; case 5:choiceend=1;OpenF();if (!wgetchar) getchar();break; case 6:choiceend=1;CloseF();if (!wgetchar) getchar();break; case 7:choiceend=1;ReadF();if (!wgetchar) getchar();break; case 8:choiceend=1;WriteF();if (!wgetchar) getchar();break; case 9:printf("\nYou have exited this system."); QuitF();exit(0);break; case 10:choiceend=1;clrscr();break; case 11:CdF();choiceend=1;break; case 20:help();choiceend=1;break; default:choiceend=0; } } } else printf("\nAccess denied."); } void help(void) { printf("\nThe Command List\n"); printf("\nCd Attrib Creat Modify Read Open Cls Delete Exit Close\n"); } char *rtrim(char *str) /*remove the trailing blanks.*/ {int n=strlen(str)-1; while(n>=0) {if(*(str+n)!=' ') {*(str+n+1)='\0'; break; } else n--; } if (n<0) str[0]='\0'; return str; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五文件系统设计
一、文件的系统调用
1.文件描述符(fd)
UNIX的底层输入输出系统调用用一个整数来代表所打开的文件,这就文件描述符。

文件描述符与打开的文件名建立一一对应的关系。

2.Creat/link/unlink系统调用
Fd=creat(name,pmode);
Name为文件名,整数pmode为文件的许可机制。

Link建立链接,unlink删除链接。

3.Open/close系统调用
Fd=open(name,rwmode,[,pmode]);
Rwmode表示读写方式的整数,0—只读1—只写2—读写
Status=close(fd);
4.read/write系统调用
n=read(fd,buffer,size);
n=write(fd,buffer,size);
buffer是字符指针,存放读/写字节流的地址。

5.随机存取的系统调用lseek和tell
newpos=lseek(fd,offset,origin);
offset为位移量,origin=0从文件头开始,1从当前位置开始,2从文件尾开始。

Pos=tell(fd);报告当前文件指针的位置。

6.记录的锁定:就是进程在对文件的某个部分进行某种操作期间,为这部分文件内容设立一个“正在使用”的标志,防止其它进程对文件的这个部分进行操作。

status=lockf(fd,func,size);
func=0开锁,1锁定,2测试是否锁定,若已锁返回-1,若未锁则锁定,3测试是否
锁定,若已锁返回-1,若未锁返回0。

分析下面程序的执行结果:
#include <stdio.h>
#include <unistd.h>
main()
{int fd,int a[10],i;
for (i=0;I<10;i++) a[i]=i+1;
fd=creat(“aaa”,0755);
printf(“lockf 40 bytes in parent…\n”); fflush(stdout);
lockf(fd,1,40);
printf(“…locked.\n”);fflush(stdout);
if (fork()==0)
{printf(“Enter child,write 20 bytes in child…\n”);
fflush(stdout);
write(fd,a,20);
printf(“…writeen.\n”);fflush(stdout);
printf(“lockf 80 bytes in child…\n”);fflush(stdout);
lockf(fd,1,80);
printf(“…locked in child.\n”);fflush(stdout);
sleep(2);
lockf(fd,0,80);
printf(“…child unlocked.\n”);fflush(stdout);
exit(0);
}
printf(“Parent sleep now…\n”);
sleep(0);
prinf(“…parent wakeup.\n”);
printf(“Parent unlock now…\n”);fflush(stdout);
lockf(fd,0,40);
printf(“…Parent unlocked.\n”);fflush(stdout);
wait(0);
printf(“Program end.\n”);
}
二、实验内容
为Linux系统设计一个简单的文件系统。

要求做到以下几点:
(1)可以实现下列几条命令;
dir 列文件目录
create 创建文件
delete 删除文件
read 读文件
write 写文件
(2)列目录时要列出文件名、存取权限(八进制)、文件长度、时间(三种);(3)源文件可以进行读写保护。

相关文档
最新文档