基于Linux的模拟文件系统的设计与实现32696

合集下载

嵌入式Linux下文件管理系统的设计与实现

嵌入式Linux下文件管理系统的设计与实现

对 文 件加 密 和解 密 . 达 到对 系统 文 件 的安 全保 护 圈 。
图 1 加 密 文 件 管 理 系 统 结 构 图
现 代 计 算 机 2 0 1 5 . 0 5 下 ⑥
Re s e a r c h a n d De s i g n o f Hi g h wa y Tu n n e l Mo n i t o r i n g Sy s t e m
块 的 执 行 必 须 是 用 户 通 过 认 证模 块 用 户 认 证 通 过 用 户名和密码认证 . 本 系统 不 直 接 存 储 用 户 名 密 码 . 而 是
效手段 加 密文件系统可 以防止管 理员利 用别 的操作
系统 窃 取 计 算 机 中 的数 据 _ 1 1
目前 .加 密 基 于 L i n u x的文 件 加 密 系 统 主要 有
加 密 文 件 系统 模 块 主 要 包 括 文 件 保 护 模 块 、用 户 认证模块 、 文 件浏 览 。关 系 图如 图 1 所示 。 文 件加 密和解 密是 通过 D E S算 法 实 现 的 由 于
者通 过硬件 设备 以及计算机 网络 .对数据进 行入侵篡 改. 对数据 的安全性提 出更高 的要求 。 最根本 的原 因是 由于计算机 中大多数 的数据 以明文 的形式存储 .所 以
文章编号 : 1 0 0 7 — 1 4 2 3 ( 2 0 1 5 ) 1 5 — 0 0 6 3 — 0 4
D OI : 1 0 . 3 9 6 9  ̄ . i s s n . 1 0 0 7 — 1 4 2 3 . 2 0 1 5 . 1 5 . 0 1 6
嵌入 式 L i n u x下文件管理 系统 的设计与 实现
王文 晶. 胡艳 慧

基于Linux的嵌入式文件系统构建与设计

基于Linux的嵌入式文件系统构建与设计

基于Linux的嵌入式文件系统构建与设计基于Linux的嵌入式文件系统构建与设计一、文件系统:文件系统(File system)指代贮存在计算机上的文件和目录。

文件系统可以有不同的格式,叫做文件系统类型(file system types)。

这些格式决定信息是如何被贮存为文件和目录。

某些文件系统类型贮存重复数据,某些文件系统类型加快硬盘驱动器的存取速度。

因此文件系统就是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。

也指用于存储文件的磁盘或分区,或文件系统种类。

上图是一个完整操作系统的文件系统构架,下文中将对文件系统中各个部件进行一定的介绍。

<!--[if !supportLists]-->1.1<!--[endif]-->Linux系统文件类型:● Linux系统中文件的类型包括:普通文件、目录文件、连接文件、设备文件、管道(FIFO)文件和套接字文件。

● 普通文件:是流式文件,● 目录文件:用于表示表示和管理系统中的全部文件● 连接文件:用于不同目录下文件的共享● 设备文件:包括块设备文件和字符设备文件。

块设备文件表示磁盘、关盘等,字符设备文件联系着按照字符进行操作的终端、键盘等设备。

● 管道(FIFO)文件:提供进程间通信的一种方式。

● 套接字(socket)文件和网络通信有关。

1.2 逻辑文件系统:文件的逻辑结构是用户可见结构,即从用户角度观察到的文件系统。

可以分为两大类:字节流式的无结构文件和记录式有结构文件。

由字节流(字节序列)组成的文件是一种无结构文件或流式文件,不考虑文件内部的逻辑结构,只是简单地看作式一系列字节的序列,便于在文件任意位置添加内容。

很多操作系统多采用这种形式,如UNIX/Linux、DOS、Windows等。

由记录组成的文件称为记录式文件,记录是这种文件的基本信息单位,记录式文件通常用于信息管理。

1.3 虚拟文件系统:Linux在传统的逻辑文件系统的基础上,增加了一个虚拟文件系统(Virtual File System,VFS)的接口层,VFS在最上层,管理各种逻辑文件系统,屏蔽了他们之间的差异,为用户命令、函数调用和内核其他部分提供访问文件和设备的统一接口,使得不同的逻辑文件系统按照同样的模式呈现在使用者面前,对于用户来讲,觉察不到逻辑文件系统的差异,可以使用同样的命令来操作不同的逻辑文件系统所管理的文件,可以在他们之间自由地复制文件。

操作系统课程设计-文件系统的模拟设计

操作系统课程设计-文件系统的模拟设计

操作系统课程设计报告题目:文件系统的模拟设计一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

二、设计内容(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的模拟文件系统的设计与实现起迄日期: 2011年12月22日- 2012年1月7日****:**2012 年 1月 7 日1.需求分析本次课程设计题目为“基于Linux的模拟文件系统的设计与实现”,要求在linux开源环境下,通过使用系统库函数以及操作命令,模拟实现典型文件系统,实现文件的各项基本操作,以此加深对所学文件操作的了解以及操作方法的特点。

通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深教材中的重要算法的理解,同时通过编程实现这些算法,更好地掌握操作系统的远离及实现方法,提高综合运用各专业课知识的能力。

根据实验要求可将系统功能简述如下:(1)设计一个10个用户的文件系统。

每个用户最多可以保存10个文件,一次运行用户可打开多个文件。

(2)程序采用二级文件目录。

(即设置主目录(MFD)和用户文件目录(UFD))。

另外,可打开文件设置指针。

(3)为了方便实现,对文件的读写作了简化。

在执行读写命令时,只需改读写指针。

并不进行实际的读写操作。

(4)实现目录的相关操作:改变目录(CD),创建目录(MD),显示目录(DIR),删除目录(RD)。

(5)实现文件的相关操作:打开文件(open),关闭文件(close),创建一个新文件(create),删除一个文件(delete),写文件(write),读文件(read)。

(6)考虑特殊情况如:目录不存在时,给出错误信息;不能用cd进入文件;命令之中不能有空格(如ex it,给出错误提示);新建目录或文件时的问题、重名问题、目录或文件的名字长度限制、目录或文件的名字中包含不合法字符(注意空格)、删除目录或文件时的问题、删除不存在的文件或目录给出错误提示、删除目录时目录不为空(如果该目录为空,则可删除,否则给出是否做删除提示,删除操作将该目录下的全部文件和子目录都删除)、进入到某个目录下,却要删除本目录或上级目录、不能用delete删除目录、不能用RD删除文件等。

基于Linux的模拟文件系统的设计与实现

基于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个文件。

模拟文件系统的设计与实现

模拟文件系统的设计与实现
文件的读:read文件的写:write文件关闭:close
删除文件: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;

基于Linux的模拟存储器管理的设计与实现任务书

基于Linux的模拟存储器管理的设计与实现任务书
5.设计成果形式及要求:
课程设计说明书
模拟存储器管理系统软件
6.工作计划及进度:
2013年11月22日--2013年11月26日需求分析;
2013年11月27日--2013年11月28日概要设计和详细设计;
2013年11月29日--2013年12月3日编码、连接;
2013年12月4日--2013年12月5日测试,撰写课程设计说明书;
(1)根据设计内容和要求进行需求分析,分析出系统的主要功能和设计重点。
(2)根据需求分析的内容在小组中合理划分模块。
(3)利用C, C++或JAVA语言在Linux平台下进行程序设计并调试通过。
(4)按格式要求,每人根据自己的工作写出课程设计说明书。
课程设计任务书
4.主要参考文献:
[1]汤子瀛,哲凤屏,汤小丹.计算机操作系统.陕西:西安电子科技大学出版社,2001.8
(4)假定页面大小为512K,进程执行时页面调度顺序要求手动输入。
要求:
(1)要求在屏幕上输出各进程页面置换过程(以图表形式描述)以及每种页面置换算法的缺页率和置换率,并对比各算法的优劣。
(2)要求在Linux平台下,使用C, C++或JAVA语言进行开发。
..
3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:
2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等):
设计内容:
(1)在内存开辟两块存储空间,分别模拟内存和外存,大小分别是8M,25M。
(2)给定三个文件A,B,C,大小分别是4.2M,8M和9.8M。模拟其并发执行过程。
(3)每个进程在内存中固定分配4个页面,缺页时分别采用四种置换算法(FIFO, LRU, NUR, OPT)进行置换。

面向Linux用户的网络文件管理系统的设计与实现

面向Linux用户的网络文件管理系统的设计与实现

面向Linux用户的网络文件管理系统的设计与实现1 绪论1.1 氧化铝基陶瓷材料1.1.1 氧化铝陶瓷的晶型结构陶瓷材料是一种无机非金属材料,主要有Al2O3、SiC、ZrB2、BN等。

作为复合陶瓷的增韧基体,Al2O3是当下研究中使用频率较高的。

Al2O3有多种同质易晶体,主要的晶型有α-Al2O3、β- Al2O3、γ- Al2O3三种,其转换关系如图1.1所示。

图1.1 氧化铝的晶型转变γ- Al2O3的结构为尖晶石型,高温下不稳定,一般不单独使用[1]。

β- Al2O3实质上是一种碱性铝酸盐,a=0.56nm,c=2.25nm,密度3.30-3.63g/cm3,在1600℃的高温下会转变成α-Al2O3。

α-Al2O3在高温下较为温度,密度一般为3.96-4.01 g/cm3。

1.1.2 氧化铝陶瓷的性能氧化铝陶瓷中Al2O3的质量分数一般为75.0%-99.0%。

商品氧化铝习惯以质量分数来命名,质量分数大于85%的Al2O3的叫高铝瓷,Al2O3质量分数为95%的叫95瓷,质量分数为99%的Al2O3的叫99瓷,而质量分数大于99%的Al2O3的叫刚玉瓷。

氧化铝陶瓷物理性能优异,维氏硬度高达19.3,致密度高,同时还拥有杰出的耐高温、耐腐蚀、切削性、不导电等性能。

Al2O3陶瓷属于高温结构陶瓷,其物理性能与Al2O3的百分含量有着紧密的关系。

表1.1、和表1.2分别列出了高密度氧化铝和低密度氧化铝的一些力学性能。

表1.1 高密度氧化铝的力学性能Al2O3/% >99.9 >99.7①>99.7②99-99.7密度/(g/cm3)3.97-3.99 3.6-3.85 3.65-3.85 3.89-3.96硬度/HV 19.3 16.3 15-16 15-16KIC/(MPa·m1/2) 2.8-4.5 - - 5.6-6弹性模量/GPa 366-410 300-380 300-380 330-400室温弯曲强度/MPa 550-600 160-300 245-412 550膨胀系数/×10-6K-1(200-1200℃) 6.4-8.9 5.4-8.4 5.4-8.4 6.4-8.2室温热导率/[W·(m·K)-1] 38.9 28-33 30 30.4烧成温度/℃1600-2000 1750-1900 1750-1900 1700-1750注:①不含MgO二次再结晶;②含MgO表1.2 低密度氧化铝的力学性能Al2O3/% 99-96.5 94.5-96.5 86-94.5 80-86密度/(g/cm3)3.73-3.8 3.7-3.9 3.4-3.7 3.3-3.4硬度/HV 12.8-15 12-15.6 9.7-12 -弹性模量/GPa 300-380 300 250-330 200-240弯曲强度/MPa 230-350 310-330 250-330 200-300膨胀系数/×10-6K-1(200-1200℃) 8-8.1 7.6-8 7-7.6 -室温热导率/[W·(m·K)-1] 24-26 20-24 15-20 -烧成温度/℃- 1520-1600 1440-1600 -1.2 氧化铝陶瓷增韧目前,铁、铜、铝等常用金属的KIC范围大约为10-50MPa·m1/2,而大部分单质陶瓷和玻璃的KIC仅有0.5-6MPa·m1/2,远远低于铁、铜、铝等常用金属的KIC。

基于Linux的文件系统设计

基于Linux的文件系统设计

无敌操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:学号:设计题目:基于Linux的模拟文件系统的设计与实现起迄日期:指导教师:1.需求分析1.1 功能介绍基于Linux的模拟文件系统的设计与实现完成以下功能:(1)创建用户:创建多个用户,输入用户名;每个用户最多可以保存多个文件。

(2)用户登录:手动的登录已经创建的用户,正确输入用户名即可成功登录。

(3)创建二级文件目录(MD):手动的输入目录名称,(即设置主目录(MFD)和用户文件目录(UFD))。

(4)显示目录(show_content):将用户创建的目录显示在界面上。

(5)删除目录(delete_content):手动输入目录的名称即可删除已经创建的目录。

(6)进入目录:进入目录内部,可以进行文件的各种操作。

(7)复制目录(modify_content):在用户登录后,输入要修改的目录名称,对其进行修改,输入新的目录名并保存。

(8)建立一个文件(create):在目录中手动输入文件名,可以创建新的文件,在创建的同时输入文件的保护码,对文件内容进行保护,防止信息泄露。

(9)删除一个文件(delete):手动输入已经创建的文件的名称,即可删除此文件。

(10)写文件(write):手动的在文件中写入内容。

(11)读文件(read):查看文件中的已经写入的内容。

(12)修改文件属性(modifyfile):通过修改属性改变文件类型。

基于其低廉成本与高度可设定性,Linux常常被应用于嵌入式系统,例如机顶盒、移动电话及行动装置等。

在移动电话上,Linux已经成为与Symbian OS、Windows Mobile系统并列的三大智能手机操作系统之一;而在移动装置上,则成为Windows CE与Palm OS 外之另一个选择。

目前流行的TiVo数位摄影机使用了经过定制化后的Linux。

此外,有不少硬件式的网络防火墙及路由器,例如部份LinkSys的产品,其内部都是使用Linux来驱动、并采用了操作系统提供的防火墙及路由功能。

实验二 文件系统模拟设计

实验二  文件系统模拟设计

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

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

要求做到以下几点:(1)可以实现下列几条命令(至少4条);login 用户登录dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保三、实验内容指导提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

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

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

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

★★★★★《程序设计思想参考》<程序设计>(1)设计思想本系统是模拟实现多用户多目录的文件系统(8个用户),在系统出现登录后 ,输入用户与口令,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。

系统的命令与其命令的具体实现,此模拟系统共提供了上述命令,并根据命令的含义与要求,用C++编程来完成所有具体操作。

该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能。

【注:在linux 下用g++编译C++】(2)主要数据结构用户结构:账号与密码结构typedef struct users{char name[8];char pwd[10];}users;本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。

users usrarray[8] ={"usr1","usr1","usr2","usr2","usr3","usr3","usr4","usr4","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};(3)数据结构说明a)文件结构链表struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};b)函数介绍fnode *initfile(char filename[],int isdir);//初始化文件或目录void createroot();//建立系统根目录int run();系统运行int findpara(char *topara);对参数进行处理bool chklogin(char *users, char *pwd);检查账号与口令void help();命令列表int mkdir();建立目录int create();建立文件int read();读取文件int write();写入文件int del();删除文件int cd();切换目录int dir();文件与目录列表(4)各模块流程图(5)、模拟文件系统参考程序清单#include "stdio.h"#include "iostream.h"#include "string.h"#include "iomanip.h"#define FILENAME_LENGTH 10 //文件名称长度#define COMMAND_LENGTH 10 //命令行长度#define PARA_LENGTH 30 //参数长度//账号结构typedef struct users{char name[8];char pwd[10];}users;//文件结构struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};//账号users usrarray[8] ={"usr1","usr1","usr2","usr2","usr3","usr3","usr4","usr4","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};fnode *initfile(char filename[],int isdir);void createroot();int run();int findpara(char *topara);bool chklogin(char *users, char *pwd);void help();int mkdir();int create();int read();int write();int del();int cd();int dir();fnode *root,*recent,*temp,*ttemp;char para[PARA_LENGTH],command[COMMAND_LENGTH],temppara[PARA_LENGTH],recentpara[PARA_LENGTH];//创建文件与目录结点fnode* initfile(char filename[],int isdir){fnode *node=new fnode;strcpy(node->filename,filename);node->isdir=isdir;node->isopen=0;node->parent=NULL;node->child=NULL;node->prev=NULL;node->next=NULL;return node;}//创建文件存储结点void createroot (){recent=root=initfile("/",1);root->parent=NULL;root->child=NULL;root->prev=root->next=NULL;strcpy(para,"/");}int mkdir(){temp=initfile(" ",1);cin>>temp->filename;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==1) {printf("对不起,目录已存在!");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;}return 1;}int create(){temp=initfile(" ",0);cin>>temp->filename;cin>>temp->content;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;cout<<"文件建立成功!"<<endl;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==0){printf("对不起,文件已存在!");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;cout<<"文件建立成功!"<<endl;}return 1;}int dir(){int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root){cout<<" <DIR> "<<".."<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors " <<i<<" files "<< j <<endl;return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<" <DIR> "<<temp->filename<<endl; i++;}else{cout<<" <FILE> "<<temp->filename<<endl; j++;}temp=temp->next;}cout<<"Total: "<<" directors " <<i<<" files "<< j <<endl;}int read(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {cout<<recent->child->content<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0){cout<<temp->next->content<<endl;return 1;}}cout<<"文件不存在!"<<endl;}}int write(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {recent->child->isopen=1;//设置文件标记为打开cin>>recent->child->content;recent->child->isopen=0;//设置文件标记为关闭cout<<"文件写入成功!"<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0) {recent->child->isopen=1;//设置文件标记为打开 cin>>temp->next->content;recent->child->isopen=0;//设置文件标记为关闭cout<<"文件写入成功!"<<endl;return 1;}}cout<<"文件不存在!"<<endl;}}int cd(){ char topara[PARA_LENGTH];cin>>topara;if(strcmp(topara,"..")==0){int i;while(recent->prev)recent=recent->prev;if(recent->parent){recent=recent->parent;}i=strlen(para);while(para[i]!='/' && i>0) i--;if(i!=0)para[i]='\0';elsepara[i+1]='\0';}else{findpara(topara);}return 1;}int findpara(char *topara){int i=0;int sign=1;if(strcmp(topara,"/")==0){recent=root;strcpy(para,"/");return 1;}temp=recent;strcpy(temppara,para);if(topara[0]=='/'){recent=root->child;i++;strcpy(para,"/");}else{if(recent!=NULL && recent!=root)strcat(para,"/");if(recent && recent->child){if(recent->isdir)recent=recent->child;else{printf("路径错误!\n");return 1;}}}while(i<=strlen(topara) && recent){int j=0;if(topara[i]=='/' && recent->child){i++;if(recent->isdir)recent=recent->child;else{printf("路径错误\n");return 0;}strcat(para,"/");}while(topara[i]!='/' && i<=strlen(topara)){recentpara[j]=topara[i];i++;j++;}recentpara[j]='\0';while((strcmp(recent->filename,recentpara)!=0 || (recent->isdir!=1)) && recent->next!=NULL) {recent=recent->next;}if(strcmp(recent->filename,recentpara)==0){if(recent->isdir==0){strcpy(para,temppara);recent=temp;printf("是文件不是目录。

Linux文件系统模拟

Linux文件系统模拟

大连海事大学毕 业 论 文二○一二年六月┊┊┊┊┊┊┊装┊┊┊┊┊┊┊订┊┊┊┊┊┊┊线┊Linux文件系统模拟专业班级:计算机科学与技术4班姓名:李征指导教师:史一民信息科学技术学院摘要目前,Linux技术已经成为IT技术发展的热点,投身于Linux技术研究的社区、研究机构和软件企业越来越多,支持Linux的软件、硬件制造商和解决方案提供商也迅速增加,Linux在信息化建设中的应用范围也越来越广,Linux产业链已初步形成,并正在得到持续的完善。

随着整个Linux 产业的发展,Linux技术也处在快速的发展过程中,形成了若干技术热点。

为了辅助教学,帮助学生更好的理解Linux系统,本文模拟Linux文件管理的功能,设计了一个简洁的文件系统。

给出了模拟文件系统的数据结构设计和整体框架,给出了系统实现各功能模块的函数。

系统通过调用函数实现了用户的登录、创建目录、更改目录、创建文件、修改文件以及用户权限管理等功能。

在界面设计上使用MFC可视化设计,将实现的代码加载到MFC界面中,在响应鼠标消息的函数中调用实现模拟系统设计的代码,这样最后的操作是在Windows界面的操作,响应鼠标的命令。

界面简洁,操作方便。

本系统可以作为操作系统实验课程的实例。

关键词:操作系统;文件系统; Linux文件系统模拟;算法ABSTRACTCurrently, Linux IT technology has become a hot development technology. Participating in Linux technology research communities, research institutes and software enterprises are in support of Linux more and more, software and hardware manufacturers and solution providers have increased rapidly, in the development of the information industry the Linux application is also increasing, Linux industry chain has taken shape, and is sustained improvidently. With the entire industry in the development of Linux, and Linux is also at the rapid development process, formed a number of technical points.In order to assist teaching to help students better understand the Linux system, Linux file management module for the simulation of the subject function, design a simple file system. Simulation file system data structure design and the overall framework, given the division of the system to achieve the function of each functional module and its complete function. System by calling the function the user’s login, creates directories, change directory, create files, modify files, and user rights management.In the interface design using MFC visual design, will realize the code to load MFC interface, in response to the news of the mouse function call simulating system design code, which finally operation is in Windows interface operation, the response of the mouse command. The interface is simple and easy to operate.This system can be used as the experimental course of the operating system instance.Keyword: Operating System; File System; UNIX; Linux; Simulation第1章绪论1.1 选题背景和意义“操作系统”是计算机科学中一门重要的专业基础课,是计算机系统的核心和灵魂,同时又是一门实践性很强的技术课程。

基于Linux的操作系统和文件系统设计与开发

基于Linux的操作系统和文件系统设计与开发

基于Linux的操作系统和文件系统设计与开发1. Linux操作系统的发展Linux操作系统诞生于1991年,最初由芬兰计算机科学学生Linus Torvalds开发。

Linus Torvalds希望开发一个类Unix的操作系统,该操作系统可以在个人计算机上运行,并具有开源、自由、自主等特点。

随着网络的快速发展,Linux操作系统逐渐成为了服务器端操作系统的首选,成为了世界各大科技公司和机构的主要代码库之一。

2. Linux操作系统的特点Linux操作系统首先是一个开放源代码的操作系统,任何人都可以免费获取并使用。

其次,Linux操作系统具有高度的稳定性、灵活性和扩展性。

因为它是一个开放源代码的操作系统,它可以被各种开发人员和公司定制以满足其需求。

此外,Linux系统十分安全,易于维护和管理,可以很好地管理网络和服务器。

3. Linux操作系统的文件系统设计与开发Linux操作系统的文件系统是由一系列文件和目录构成的,其中有一些文件和目录是操作系统运行所必需的。

它的根目录是/,它包含了很多基础文件系统目录,比如/bin, /dev, /etc, /usr, /var等。

其中/bin包含了最基本得可执行程序,/dev包含了设备文件,/etc包含了系统设置和配置文件,/usr则是用户程序和数据的安装位置,/var则是一些系统文件的存储位置。

Linux文件系统的设计和开发需要深入了解Linux文件系统的基本组成部分和文件系统类别,以便更好地掌握文件系统的概念和原理。

Linux文件系统通常可以分为4种,分别是ext2/ext3/ext4,ReiserFS,XFS和JFS。

它们各有优缺点,需要开发人员根据具体需要进行选择。

开发人员还需要了解文件系统中常用的AAA (Access Control、前向写日志journal,Attribution)机制、文件系统的缓存机制等。

Linux操作系统的文件系统设计与开发需要掌握文件系统操作的相关编程语言,如C++,Python等,并且要掌握文件系统的基本原理,以便能够适应不同的需求。

模拟文件系统的设计与实现之欧阳数创编

模拟文件系统的设计与实现之欧阳数创编

中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名: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#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%D ISKSIZE;/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/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 istoo 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下基于内存的虚拟文件系统设计与实现

摘要近几年来,计算机的CPU、内存和显卡等主要配件的性能都提升得很快,而与之相对应的磁盘系统性能正越来越严重地成为整个电脑系统性能提升的瓶颈。

故将一部分内存拿出做虚拟磁盘,并在虚拟磁盘上实施文件管理系统,以加快文件的管理速度,并方便用户进行各种用户操作。

基于内存的文件管理系统,顾名思义,就是将一部分内存拿出来当硬盘用,可以极大的提高在其上进行的文件访问的速度。

关键词:虚拟内存磁盘文件管理系统linux/qt/C++目录第一章课题背景1.1课题实现的背景及意义第二章项目总体设计2.1基本功能2.2目的和要求第三章详细设计3.1 程序整体框架和主要算法3.2类的设计与声明3.3程序流程图第四章实验内容4.1 运行环境4.2 运行要求4.3 核心代码第五章设计结果与分析总结参考文献第一章课题背景:1,需求概述近年来,随着操作系统内存容量的不断地增加,然而相当一部分的操作系统内存却是浪费了。

为此出现了虚拟硬盘的概念,希望能借此实现不同情况的磁盘转储和合理利用内存。

由于操作系统的虚拟内存很大,因此可以利用这些内存开辟一块空间作为虚拟磁盘。

在此虚拟硬盘上,进行模拟Windows文件管理系统的对系统之中的真实的文件的管理。

我们采用linux/qt 作为我们的开发环境,并实现了可视化界面,所有操作无需输入命令,而是通过点击按钮实现相应的功能。

2,需求分析2.1需求理解与模块图对用户需求的理解:该模拟文件系统包括四大模块:磁盘状态显示模块、存储模块、读取模块、文件管理模块。

一:磁盘状态显示模块:通过点击查看磁盘信息按钮可以查看磁盘的信息,其中包括显示磁盘总容量,剩余空间大小以及当中的文件总个数。

通过饼图图示,显示所用空间和剩余空间的比例,帮助用户方便的了解磁盘空间的使用情况。

二:存储模块:用户点击导入文件按钮,弹出导入文件对话框,可将指定路径的文件导入到内存磁盘中。

三:读取模块:用户点击导出文件按钮,弹出导出文件对话框,可将内存磁盘中的文件导出到指定路径的真实的物理磁盘上。

模拟文件系统的设计与实现之欧阳文创编

模拟文件系统的设计与实现之欧阳文创编

中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名: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#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%DI SKSIZE;/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/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文件系统的设计与实现

模拟Linux文件系统的设计与实现
周建涛;黄正鹏;李翔;聂玥;叶阳;韦俊宏
【期刊名称】《电脑知识与技术》
【年(卷),期】2015(000)014
【摘要】C语言作为计算机设计的高级语言,拥有很广泛的用途,该文讲述了使
用C语言如何去实现模拟一个简单的Linux文件系统,对于我们学习操作系统知
识有很好的借鉴作用。

【总页数】3页(P58-60)
【作者】周建涛;黄正鹏;李翔;聂玥;叶阳;韦俊宏
【作者单位】贵州工程应用技术学院,贵州毕节551700;贵州工程应用技术学院,贵州毕节551700;贵州工程应用技术学院,贵州毕节551700;贵州工程应用技术
学院,贵州毕节551700;贵州工程应用技术学院,贵州毕节551700;贵州工程应
用技术学院,贵州毕节551700
【正文语种】中文
【中图分类】TP311
【相关文献】
1.用于数控车床的嵌入式Linux文件系统的设计与实现 [J], 李建静
2.Linux文件系统的模拟实现 [J], 张莉莉;王卫华
3.Linux文件系统的模拟实现 [J], 张莉莉;王卫华
4.SkyEye模拟器的音频输出模拟模块设计与实现 [J], 李恒庭;洪永强
5.C语言实验设计与实现之竖式乘法模拟器 [J], 刘薪;熊启军
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:任彬学号:0921010132设计题目:基于Linux的模拟文件系统的设计与实现起迄日期:2011年12月22日- 2012年1月7日指导教师:康珺2012 年1月7 日1.需求分析本次课程设计题目为“基于Linux的模拟文件系统的设计与实现”,要求在linux 开源环境下,通过使用系统库函数以及操作命令,模拟实现典型文件系统,实现文件的各项基本操作,以此加深对所学文件操作的了解以及操作方法的特点。

通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深教材中的重要算法的理解,同时通过编程实现这些算法,更好地掌握操作系统的远离及实现方法,提高综合运用各专业课知识的能力。

根据实验要求可将系统功能简述如下:(1)设计一个10个用户的文件系统。

每个用户最多可以保存10个文件,一次运行用户可打开多个文件。

(2)程序采用二级文件目录。

(即设置主目录(MFD)和用户文件目录(UFD))。

另外,可打开文件设置指针。

(3)为了方便实现,对文件的读写作了简化。

在执行读写命令时,只需改读写指针。

并不进行实际的读写操作。

(4)实现目录的相关操作:改变目录(CD),创建目录(MD),显示目录(DIR),删除目录(RD)。

(5)实现文件的相关操作:打开文件(open),关闭文件(close),创建一个新文件(create),删除一个文件(delete),写文件(write),读文件(read)。

(6)考虑特殊情况如:目录不存在时,给出错误信息;不能用cd进入文件;命令之中不能有空格(如ex it,给出错误提示);新建目录或文件时的问题、重名问题、目录或文件的名字长度限制、目录或文件的名字中包含不合法字符(注意空格)、删除目录或文件时的问题、删除不存在的文件或目录给出错误提示、删除目录时目录不为空(如果该目录为空,则可删除,否则给出是否做删除提示,删除操作将该目录下的全部文件和子目录都删除)、进入到某个目录下,却要删除本目录或上级目录、不能用delete删除目录、不能用RD删除文件等。

.2.总体设计本系统以C语言为编程基础,通过调用linux环境下的库函数实现各功能模块。

<1>整个系统采用“主函数-子函数”结构。

系统初始化无误后,运行主函数,在主函数中通过输入参数的变化调用相关功能子函数。

各子函数之间采用平行结构,只与主函数有联系,整个系统共由17个子模块实现。

系统流程图如下:各模块按功能可分为三类:(1)文件初始化。

void initfile()(初始化文件系统); void format()(格式化); void enter()(进入文件系统)。

(2)目录管理。

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) (删除文件)。

(3)文件管理。

int mkdir(char *name) (创建子目录); int rmdir(char *name) (删除子目录); void dir()(显示当前目录的子目录); int cd(char *name) (更改当前目录); void print()(显示当前路径); void show()(输出提示信息)。

<2>为实现文件的模拟访问以及控制,利用disk.dat虚拟磁盘的管理调度,保存运行过程中各项操作以及数据。

各个子函数在功能实现时,首先必须利用相应指针定位到disk.dat文件,操作完成后将运行参数保存到文件中。

<2>结构体设计(1)二级目录实现。

为实现二级目录,定义如下结构体变量file,content。

typedef struct file{char name[10];struct file *next;}File;file结构体用于保存文件名,并通过指向下一个文件的指针形成单向链表。

typedef struct content{char name[10];File *file;int f_num;struct content *next;}Content;Content结构体用于保存目录名,此外,一方面通过指向下一个目录的指针形成单向链表,另一方面通过指向下一级的文件指针实现连接该目录头文件的作用,以此实现二级目录索引。

(2)用户访问实现。

为实现用户访问,定义如下结构体user。

typedef struct user{char name[10];char psw[10];Content *con;struct user *next;user结构体用于保存用户名和密码,通过指向下一个用户的指针将注册用户形成单向链表。

用户登录时,进行用户名、密码的判断,若正确,跳转到主界面,否则通过指针的链接到下一个用户信息,重复上述过程。

(3)虚拟磁盘管理的实现。

为实现虚拟磁盘的管理调度,定义结构体fatitem,direct,opentable。

struct fatitem /* size 8*/{int item; /*存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位0 空闲*/};Fatitem结构体用于文件配置表fat表的结构定义。

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];-};direct结构体用于目录项结构的定义,其中嵌套的FCB用于文件控制块的定义。

struct opentable{struct openttableitem{char name[9]; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/}openitem[MOFN];int cur_size; /*当前打文件的数目*/};Opentable结构体用于文件打开表项结构的定义。

3.详细设计结构化程序设计的模式是自顶向下,逐步求精的过程。

当设计一个程序时,需要将需要将求解问题逐步分解成能解决局部问题的更小的功能模块,直到每一个局部模块都不能再分为止,每一个最小化的模块对应一个相应的函数。

函数的功能应该最小化,即每个函数只完成一个简单的功能。

根据模块功能能最小化的思想,我们将程序划分为17个子模块,每个模块只负责完成一个功能,他们分别为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()(输出提示信息)以及main函数。

各个函数通过相互嵌套调用,最终完成实现linux下模拟文件的设计和实现。

(1)初始化文件系统:initfile()函数主要源码为:void initfile(){fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char));format();}使用库函数Malloc 向系统申请分配指定size个字节的内存空间。

,用来储存char 类型文件,同时初始化文件。

(2)格式化文件:void 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-1].item=-1;//fat[ROOT_DISK_NO-1].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);}本函数用来计算在程序中已定义的struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/;struct direct *cur_dir; /*当前目录*/的地址及对他们进行初始化,方便以后的使用。

相关文档
最新文档