模拟简单二级文件管理系统

合集下载

全国计算机二级VISUAL FOXPRO笔试模拟239

全国计算机二级VISUAL FOXPRO笔试模拟239

二级VISUAL FOXPRO笔试模拟239一、选择题1. 数据库(DB)、数据库系统(DBS)、数据库管理系统(DBMS)三者之间的关系是A.DBS包括DB和DBMSB.DBMS包括DB和DBSC.DB包括DBS和DBMSD.DBS就是DB,也就是DBMS答案:A[解答] 本题是对数据库理论中几个基本概念的考查。

数据库系统由五个部分组成:数据(DB)、数据库管理系统(DBMS)、硬件系统、数据库管理员和用户。

因此可知,DBS包括DB和DBMS,故选项A为正确答案。

2. 下列关于栈的描述中错误的是A.栈是先进后出的线性表B.栈只能顺序存储C.栈具有记忆作用D.对栈的插入与删除操作中,不需要改变栈底指针答案:B[解答] 本题考核栈的基本概念。

我们可以通过排除法来确定本题的答案。

栈是限定在一端进行插入与删除操作的线性表,栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素,即栈是按照“先进后出”或“后进先出”的原则组织数据的,这便是栈的记忆作用,所以选项A和选项C正确。

对栈进行插入和删除操作时,栈顶位置是动态变化的,栈底指针不变,选项D正确。

由此可见,选项B错误。

3. 专门的关系运算不包括下列中的A.连接运算B.选择运算C.投影运算D.交运算答案:D[解答] 本题考查专门的关系运算。

属于基本概念题、常考题。

在关系模型的数据库理论中,关系的基本运算有三种:连接运算、选择运算、投影运算,不包括交运算,因此可以得出答案为D。

4. 编制一个好的程序,首先要保证它的正确性和可靠性,还应强调良好的编程风格,在选择标识符的名字时应考虑A.名字长度越短越好,以减少源程序的输入量B.多个变量共用一个名字,以减少变量名的数目C.选择含义明确的名字,以正确提示所代表的实体D.尽量用关键字作名字,以使名字标准化答案:C。

计算机专业基础综合(文件管理)模拟试卷3(题后含答案及解析)

计算机专业基础综合(文件管理)模拟试卷3(题后含答案及解析)

计算机专业基础综合(文件管理)模拟试卷3(题后含答案及解析) 题型有:1. 单项选择题 2. 综合应用题单项选择题1-40小题,每小题2分,共80分。

下列每题给出的四个选项中,只有一个选项是最符合题目要求的。

1.UNIX系统中,文件存储器的管理采用的是( )。

A.位图法B.空闲块表法C.成组链接法D.单块连接法正确答案:C 涉及知识点:文件管理2.只适合顺序存取,不提供随机存取功能的存储介质是( )。

A.磁盘B.磁鼓C.磁带D.光盘正确答案:C 涉及知识点:文件管理3.对磁盘请求重新排队的目的是( )。

A.重置移臂时间B.让优先级高的进程先I/OC.减少传输时间D.减少旋转时间正确答案:D 涉及知识点:文件管理4.下列不便于文件扩充的物理文件结构是( )。

A.连续文件B.串联文件C.索引文件D.多重索引文件正确答案:A 涉及知识点:文件管理5.在文件系统中,文件的不同物理结构有不同的优缺点。

在下列文件的物理组织结构中,不具有直接读写文件任意一个记录的能力的结构是( )。

A.连续文件B.串联文件D.逻辑文件正确答案:B 涉及知识点:文件管理6.文件系统为每个文件另建立一张指示逻辑记录和物理记录之间的对应关系表,由此表和文件本身构成的文件是( )。

A.连续文件B.串联文件C.索引文件D.逻辑文件正确答案:C 涉及知识点:文件管理7.在磁盘上,最容易导致存储碎片发生的物理文件结构是( )。

A.隐式链接B.顺序存放C.索引存放D.显式链接正确答案:B解析:本题考查物理文件结构的特点。

顺序文件的优点是在顺序存取时速度较快,因为这类文件往往从头至尾依次顺序存取。

但是也存在缺点,首先要求在存储文件时确定文件的长度,依此来分配相应的存储空间,这样会造成在寻找存储空间时耗时较多,一旦没有足够的存储空间来存放该文件时会造成文件存储的失败。

其次,顺序文件不便于文件的扩充,在实际工作中,文件的长度往往会改变,可能会变长,也有可能变短。

操作系统课程设计项目参考

操作系统课程设计项目参考

滴加碘液后
滴加碘液前
12/12/2021
第十二页,共二十三页。
消化(xiāohuà):在消化道内将食物分解成可吸收 (xīshōu)的成分的过程
(包括物理性消化和化学性消化)
吸收(xīshōu):营养物质通过消化道壁进入循环 系统的过程
12/12/2021
第十三页,共二十三页。
消化(xiāohuà)和吸收的过程
12/12/2021
第十九页,共二十三页。
练习(liànxí)
• 2、分析数据,指出(zhǐ chū)哪一部分消化道中消化液最多。
• 在每天摄入800克食物和1200毫升水的情况下, 消化腺大致分泌以下数量消化液。 1500毫升唾液 2000毫升胃液 1500毫升肠液 500毫升胆汁 1500毫升胰液
12/12/2021
第二十二页,共二十三页。
内容 总结 (nèiróng)
第二节。食物中的营养物质是在消化系统中被消化和吸收的。这粒西瓜籽在姗姗的消化道内, 经过了难忘的时光。它先遇到像轧钢机似的上、下尖硬的怪物,差点儿将它压得粉身碎骨。后来它
No 钻进了一条(yī tiáo)又长又窄的迷宫,它在这里走了很久,身边的许多物质都神秘地消失了。走出迷
唾液腺、胃腺(wèixiàn)、肝脏、胰腺、肠腺
1、淀粉在__口__腔__开始消化、蛋白质在____开始胃消化、脂肪在_______开始 消小化肠。
2、胆汁是一种消化液,但不含消化酶,起乳化脂肪的作用。
二、人体消化、吸收的主要器官—— _____小肠 能 训 练解
胰脏:分泌(fēnmì)胰液 肠腺:分泌肠液
肝脏:最大的腺体,分泌胆汁。 胆汁无消化酶,有乳化脂肪 的
作用。
第七页,共二十三页。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书一、实验说明1、实验目的实验是操作系统原理课程中不可缺少的重要教学环节,实验目的是使学生理论联系实际,使学生在实践探索中去发现问题、去解决问题,提高了学生获取知识和应用技术的能力,培养了学生分析和解决问题的能力。

《操作系统原理》要求理论与实践相结合,本门实验课程是对《操作系统原理》课堂教学的一个重要补充,与理论学习起着相辅相成的作用,是实施《操作系统原理》教学的一个重要组成部分。

通过本实验课的实践学习,可以增强本专业的学生对系统实现的认识。

对加深理解和掌握操作系统相关原理有重要帮助。

2、实验要求进一步了解和掌握操作系统原理,提高系统设计的能力。

对每一实验题目,应独立完成,并要求:·上机前,学生必须做好充分的实验准备工作,掌握与实验相关的背景知识,用任一种高级语言编写程序。

·上机时,认真调试,并观察、记录程序运行过程中出现的现象和问题。

·上机后,分析实验结果并写出实验报告。

3、实验报告要求每个实验(包括选做的)均应编写实验报告,学生实验后要写出严谨的、实事求是的、文字通顺的、字迹公整的实验报告。

实验报告应包括以下内容:(1)实验题目(2)实验目的(3)实验内容●程序中使用的数据结构及符号说明●流程图●源程序清单并附上注释(4)实验结果及分析●运行结果(必须是上面程序清单所对应输出的结果)●对运行情况所作的分析以及本次调试程序所取得的经验。

如果程序未能通过,应分析其原因。

二、实验内容实验一熟悉使用计算机系统一、实验名称:熟悉使用计算机系统二、实验目的与要求通过对Windows操作系统的使用,熟悉Windows操作系统中的基本概念,如单用户、多任务、进程和文件等,熟悉Windows中命令行方式下常用命令的使用方法;进一步熟悉TC语言与开发环境,为以后的实验打好基础。

三、实验内容1.开机后,熟悉Windows的界面(桌面、任务栏、开始按钮<点击后出现“开始”菜单>、我的电脑图标、回收站、我的文档)。

计算机等级考试二级办公软件高级应用模拟题2020年(32)_含答案与解析)-交互86

计算机等级考试二级办公软件高级应用模拟题2020年(32)_含答案与解析)-交互86

计算机等级考试二级办公软件高级应用模拟题2020年(32)(总分100, 做题时间120分钟)选择题1.程序流程图中带有箭头的线段表示的是SSS_SINGLE_SELA图元关系B数据流C控制流D调用关系分值: 3.5答案:C程序流程图是一种传统的、应用广泛的软件过程设计工具,通常也称为程序框图。

其中,用带箭头的线段表示控制流,用矩形表示加工步骤,用菱形表示逻辑条件。

2.软件设计中模块划分应遵循的准则是SSS_SINGLE_SELA低内聚低耦合B高内聚低耦合C低内聚高耦合D高内聚高耦合分值: 3.5答案:B耦合性与内聚性是模块独立性的两个定性标准。

一般一个较优秀的软件设计,应尽量做到高内聚、低耦合,即提高模块内的内聚性和减弱模块之间的耦合性,有利于提高模块的独立性。

3.软件设计中划分模块的准则是SSS_SINGLE_SELA低内聚低耦合B高内聚低耦合C低内聚高耦合D高内聚高耦合答案:B耦合性与内聚性是模块独立性的两个定性标准。

一般一个较优秀的软件设计,应尽量做到高内聚、低耦合,即提高模块内的内聚性和减弱模块之间的耦合性,有利于提高模块的独立性。

4.下面描述中错误的是SSS_SINGLE_SELA系统总体结构图支持软件系统的详细设计B软件设计是将软件需求转换为软件表示的过程C数据结构与数据库设计是软件设计的任务之一DPAD图是软件详细设计的表示工具分值: 3.5答案:A软件设计是将软件需求转换为软件表示的过程;数据结构与数据库设计是软件设计的任务之一;PAD图,即问题分析图,是一种主要用于描述软件详细设计的图形工具。

5.下面不属于需求分析阶段任务的是SSS_SINGLE_SELA确定软件系统的功能需求B确定软件系统的性能需求C需求规格说明书评审D制定软件集成测试计划分值: 3.5答案:D需求分析阶段的工作可分为4个阶段:需求获取、需求分析、编写需求规格说明书、需求评审。

6.数据字典(DD)所定义的对象都包含于SSS_SINGLE_SELA数据流图(DFD图)B程序流程图C软件结构图D方框图答案:A本题考查数据流图概念。

二级ACCESS数据库程序设计模拟试题及答案解析(16)

二级ACCESS数据库程序设计模拟试题及答案解析(16)

二级ACCESS数据库程序设计模拟试题及答案解析(16)(1/40)单项选择题第1题设循环队列为Q(1:m),其初始状态为front=rear=m。

经过一系列入队与退队运算后,front=20,rear=15。

现要在该循环队列中寻找最小值的元素,最坏情况下需要比较的次数为______。

A.5B.6C.m-5D.m-6下一题(2/40)单项选择题第2题某二叉树的前序序列为ABCDEFG,中序序列为DCBAEFG,则该二叉树的后序序列为______。

A.EFGDCBAB.DCBEFGAC.BCDGFEAD.DCBGFEA上一题下一题(3/40)单项选择题第3题下列叙述中正确的是______。

A.在链表中,如果每个节点有两个指针域,则该链表一定是非线性结构B.在链表中,如果有两个节点的同一个指针域的值相等,则该链表一定是非线性结构C.在链表中,如果每个节点有两个指针域,则该链表一定是线性结构D.在链表中,如果有两个节点的同一个指针域的值相等,则该链表一定是线性结构上一题下一题(4/40)单项选择题第4题下列叙述中错误的是______。

A.在带链队列中,队头指针和队尾指针都是在动态变化的B.在带链栈中,栈顶指针和栈底指针都是在动态变化的C.在带链栈中,栈顶指针是在动态变化的,但栈底指针是不变的D.在带链队列中,队头指针和队尾指针可以指向同一个位置上一题下一题(5/40)单项选择题第5题软件生命周期中,确定软件系统要做什么的阶段是______。

A.需求分析B.软件测试C.软件设计D.系统维护上一题下一题(6/40)单项选择题第6题下面对软件测试和软件调试有关概念叙述错误的是______。

A.严格执行测试计划,排除测试的随意性B.程序调试通常也称为DebugC.软件测试的目的是发现错误和改正错误D.设计正确的测试用例上一题下一题(7/40)单项选择题第7题下面属于系统软件的是______。

A.财务管理系统B.编译软件C.编辑软件WordD.杀毒软件上一题下一题(8/40)单项选择题第8题将E-R图转换为关系模式时,E-R图中的实体和联系都可以表示为______。

模拟简单二级文件管理系统

模拟简单二级文件管理系统

模拟简单二级文件管理系统简单二级文件管理系统是一种用于管理和组织计算机文件的软件系统。

它提供了一种方便的方式来浏览、创建、修改和删除文件,以及对文件进行分类和搜索。

本文将介绍如何设计和实现一个模拟简单二级文件管理系统。

一、系统概述模拟简单二级文件管理系统是一个基于命令行界面的文件管理系统。

用户可以通过输入不同的命令来执行文件管理操作,如创建文件夹、创建文件、查看文件列表、移动文件等。

系统支持两级文件结构,即可以在根目录下创建文件夹,并在文件夹下创建文件。

系统还提供了文件搜索功能,用户可以根据文件名或文件类型进行搜索。

二、系统功能1. 创建文件夹:用户可以通过输入命令,在指定路径下创建一个新的文件夹。

2. 创建文件:用户可以通过输入命令,在指定路径下创建一个新的文件。

3. 查看文件列表:用户可以通过输入命令,查看指定路径下的文件夹和文件列表。

4. 移动文件:用户可以通过输入命令,将指定文件或文件夹移动到目标路径下。

5. 复制文件:用户可以通过输入命令,将指定文件或文件夹复制到目标路径下。

6. 删除文件或文件夹:用户可以通过输入命令,删除指定的文件或文件夹。

7. 文件搜索:用户可以通过输入命令,根据文件名或文件类型进行文件搜索。

三、系统设计1. 数据结构系统使用树状结构来表示文件系统,每个节点表示一个文件夹或文件。

节点包含以下属性:- 名称:节点的名称,可以是文件夹名称或文件名称。

- 类型:节点的类型,可以是文件夹或文件。

- 父节点:指向父节点的指针,用于表示文件夹的层次结构。

- 子节点列表:包含子节点的列表,用于表示文件夹下的文件和文件夹。

2. 系统流程系统的主要流程如下:- 用户输入命令。

- 系统解析命令,判断执行的操作类型。

- 根据操作类型,执行相应的操作。

- 更新文件系统的数据结构。

- 返回执行结果给用户。

四、系统实现系统可以使用编程语言来实现,如Python。

以下是一个简单的实现示例:```pythonclass Node:def __init__(self, name, type): = nameself.type = typeself.parent = Noneself.children = []class FileSystem:def __init__(self):self.root = Node("root", "folder")def create_folder(self, path, name):# 创建文件夹的逻辑def create_file(self, path, name):# 创建文件的逻辑def list_files(self, path):# 查看文件列表的逻辑def move_file(self, source_path, target_path): # 移动文件的逻辑def copy_file(self, source_path, target_path): # 复制文件的逻辑def delete_file(self, path):# 删除文件的逻辑def search_file(self, path, keyword):# 文件搜索的逻辑# 创建文件系统对象file_system = FileSystem()# 用户输入命令command = input("请输入命令:")# 解析命令并执行相应的操作# ...# 更新文件系统的数据结构# ...# 返回执行结果给用户# ...```以上是一个简单的模拟二级文件管理系统的设计和实现。

计算机二级模拟试题及答案

计算机二级模拟试题及答案

计算机二级模拟试题及答案计算机二级考试是许多大学生和职场人士提升自身计算机技能的重要途径。

以下为大家提供一套计算机二级模拟试题及答案,希望能对您的备考有所帮助。

一、选择题(每题 2 分,共 40 分)1、下列叙述中正确的是()A 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的B 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C 顺序存储结构能存储有序表,链式存储结构不能存储有序表D 链式存储结构比顺序存储结构节省存储空间答案:A解释:顺序存储结构的存储一定是连续的,而链式存储结构的存储空间不一定是连续的,A 选项正确。

顺序存储结构和链式存储结构都可以用于线性结构和非线性结构,B 选项错误。

两种存储结构都可以存储有序表,C 选项错误。

链式存储结构由于需要存储指针,通常比顺序存储结构更耗费存储空间,D 选项错误。

2、设一棵二叉树中有 3 个叶子结点,有 8 个度为 1 的结点,则该二叉树中总的结点数为()A 12B 13C 15D 不能确定答案:B解释:根据二叉树的性质,度为 0 的叶子结点数总是比度为 2 的结点数多 1。

已知有 3 个叶子结点,所以度为 2 的结点数为 2。

总的结点数=度为 0 的叶子结点数+度为 1 的结点数+度为 2 的结点数= 3 + 8 + 2 = 13。

3、在深度为 5 的满二叉树中,叶子结点的个数为()A 32B 31C 16D 15答案:C解释:在满二叉树中,叶子结点都在最底层。

深度为k 的满二叉树,叶子结点个数为 2^(k 1) 。

所以深度为 5 的满二叉树,叶子结点个数为 2^(5 1) = 16 。

4、下列排序方法中,最坏情况下比较次数最少的是()A 冒泡排序B 简单选择排序C 直接插入排序D 堆排序答案:D解释:冒泡排序、简单选择排序和直接插入排序在最坏情况下的比较次数均为 n(n 1) / 2 ,而堆排序在最坏情况下的比较次数为O(nlog₂n) ,所以堆排序在最坏情况下比较次数最少。

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

操作系统课程设计模拟简单二级文件管理系统*名:***学号:系别:计算机学院专业:网络工程年级:16级指导教师:2019年05 月11 日一、课程设计项目介绍(含项目介绍及设计目的)1、设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

2、项目介绍:为LINUX 设计一个简单的二级文件系统。

本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。

将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。

每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。

(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。

)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。

二、总体设计(含系统的总体结构、原理框图或各模块介绍等)1、系统总体结构图:2、模块介绍(1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。

(2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。

(3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。

接着设置磁盘i节点缓冲区,DIEMPTY表示空闲,设计成第1盘块存储用户名表,第2盘块用于存储根目录,第3盘块用于根目录下的子目录。

(4)、空闲盘块分配、回收函数:首先排除磁盘已满,无空闲盘块,或者已经是栈底的情况,接着设置栈指针下移一位,则空闲盘块少1。

如果是空闲盘块堆栈已满状态,则把空闲盘块数据写入缓冲区,栈指针指向栈底,缓冲区内容写入新回收的盘块。

最后是回收盘块,回收完毕后空闲盘块多1。

(5)、节点分配和释放函数:若没有空闲磁盘i节点,则显示相应提示信息;若空闲磁盘i节点栈空,则分为空闲磁盘i节点数可装满空闲i节点栈和剩下的空闲磁盘i节点不能装满栈区两种情况来考虑。

接着初始化磁盘i节点、分配内存i节点,并从磁盘i节点读取数据到内存i节点。

三、详细设计(数据结构、流程图、关键代码段及注释等)1、主函数流程图:2、数据块的分配流程图:3、浏览目录流程图:4、创建目录流程图:5、关键代码段及注释1、主函数:struct hinode hinode[NHINO]; //查找内存i节点的hash表struct filsys filsys; // 超级块数据结构struct user user[USERNUM]; //用户打开表数据结构struct file sys_ofile[SYSOPENFILE]; //系统打开表数据结构struct direct cur_direct[NOFILE]; //目录数据结构路径unsigned short cur_dir_id; //当前目录指针char cur_path_name[DIRSIZ];FILE *fd; //本系统的所有文件指针2、命令解释层函数:char input_buf[20]; //命令行输入缓冲区static char str[20];int over; //命令行结束标记int fd1;int i,j;// 命令解释层函数int cmdexp(){over = 0;printf("[%s@localhost%s]$ ", user[user_id].u_name, cur_path_name);getcmd();//显示当前目录if(( strcmp( input_buf, "dir" ) == 0 ) || ( strcmp( input_buf, "l" ) == 0 ) || ( strcmp( input_buf, "ls" ) == 0 )) {_dir();clearbuf();return 0;}if( strcmp( input_buf, "cd" ) == 0 ){getcmd(); //取得命令chdir ( input_buf ); //改变当前目录用函数clearbuf();return 0;}// 创建目录(建立子目录)if(( strcmp( input_buf, "mkdir" ) == 0 ) ||( strcmp( input_buf, "md" ) == 0 )) {if( over ){printf( "请在mkdir后输入要创建的目录名\n" );clearbuf();return 0;}getcmd();if( input_buf[0] == '\0' ){printf( "请在mkdir后输入要创建的目录名\n" );clearbuf();return 0;}mkdir( input_buf );while(!over){getcmd();if( input_buf[0] != '\0' )mkdir( input_buf );}return 0;}3、文件系统格式化函数:#include <stdio.h>#include "filsys.h"int format() //文件系统格式化函数{struct filsys aaa;struct inode * inode;struct user tempuser[USERNUM];struct dinode dinode_buf;struct direct dir_buf[BLOCKSIZ / DIRECTSIZ];unsigned int block_buf[BLOCKSIZ / sizeof( int )];char * buf;int i, j, k;fd = fopen( "filesystem.dat", "w+b" ); //建立文件buf = (char * )malloc( 1024*1024 ); //申请1M空间if( buf == NULL ) //申请不成功,返回{printf( "\nThe system file can't be created!\n" );return 0;}//申请成功,把其空间写入filesystem.dat,使filesystem.dat为1Mfseek( fd, 0, SEEK_SET );fwrite( buf, 1, 1024*1024, fd );free ( buf );dinode_buf.di_mode = DIEMPTY; //设置磁盘i节点缓冲区,DIEMPTY表示空闲fseek( fd, DINODESTART, SEEK_SET );for( i = 0; i < DINODEBLK * BLOCKSIZ / DINODESIZ; i++ ){fseek( fd, DINODESTART + DINODESIZ * i, SEEK_SET );fwrite( &dinode_buf, 1, sizeof( dinode_buf ), fd );}/* 1. creat the main directory and its sub dir etc and the file password */inode = iget( 0 );inode = iget( 1 ); //第1盘块放用户名表inode->i_number = 1;inode->i_mode = DIREG; //普通文件inode->i_size = sizeof( struct user ) * USERNUM;inode->i_addr[0] = 1;//用户imacih是超级用户strcpy( tempuser[0].u_name, "imacih" );strcpy( tempuser[0].password, "dgh123456" );tempuser[0].u_default_mode = SUPERMODE;tempuser[0].u_gid = 1;tempuser[0].u_uid = 1;for( i = 1; i < USERNUM; i++ ){strcpy( tempuser[i].u_name, " " );}fseek( fd, DA TASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET ); fwrite( tempuser, 1, inode->i_size, fd );iput( inode );inode = iget( 2 ); //第2盘块用于存储根目录inode->i_number = 1;inode->i_mode = DEFAULTMODE | DIDIR;inode->i_size = 2 * DIRECTSIZ;inode->i_addr[0] = 2;strcpy( dir_buf[0].d_name, "/" );dir_buf[0].d_ino = 2;strcpy( dir_buf[1].d_name, "/" );dir_buf[1].d_ino = 2;strcpy( dir_buf[2].d_name, "etc" );dir_buf[2].d_ino = 3;fseek( fd, DA TASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET ); fwrite( dir_buf, 1, inode->i_size, fd );iput( inode );inode = iget( 2 ); //2 etc dir idinode->i_number = 1;inode->i_mode = DEFAULTMODE | DIDIR;inode->i_size = 2 * DIRECTSIZ;inode->i_addr[0] = 2; //第3盘块用于根目录下的子目录strcpy( dir_buf[0].d_name, ".." );dir_buf[0].d_ino = 1;strcpy( dir_buf[1].d_name, "." );dir_buf[1].d_ino = 2;iput( inode );// 2. 初始化超级块filsys.s_ninode = DINODEBLK * BLOCKSIZ / DINODESIZ - 3; //空闲磁盘i节点数filsys.s_nfree = FILEBLK - 3; // 空闲文件块数//初始化空闲磁盘i节点堆栈*/for( i = 0; i < NICINOD; i++ ){filsys.s_inode[i] = 3 + i; // 从第3个磁盘i块,前面3个已用}filsys.s_pinode = 0; // 当前空闲块指针filsys.s_rinode = NICINOD + 3; // 下一准备装入空闲盘块号栈的盘块号// 把第1组空闲盘块放进空闲盘块堆栈for( i = 0; i < NICFREE; i++ ){filsys.s_free[i] = 3 + NICFREE - 1 - i;}filsys.s_pfree = NICFREE - 1;for( i = 3 + NICFREE * 2 - 1; i < FILEBLK; i += NICFREE ){for( j = 0; j < NICFREE; j++ ){//往缓冲区写与成组链接法组织空闲盘块有关的信息:下一组盘块空闲块号与块数block_buf[j] = i - j;}block_buf[NICFREE] = NICFREE; //该项记录本组的空闲盘块数// 把缓冲区内容写到每组空闲盘块的最后一块中bwrite( i - NICFREE, block_buf );}//最后一组空闲盘块可能不足NICFREE块,故需单独处理i = i - NICFREE;for( j = 0; j < FILEBLK - i + 1; j++ )block_buf[j] = FILEBLK - j;block_buf[NICFREE] = FILEBLK - i + 1; //最末组的空闲盘块数bwrite( i, block_buf );//把超级块写入block 1#fseek( fd, BLOCKSIZ, SEEK_SET );fwrite( &filsys, 1, sizeof( struct filsys ), fd );aaa=filsys;return 1;}4、文件系统格式化函数:#include <stdio.h>#include "filsys.h"static unsigned int block_buf[BLOCKSIZ];// 空闲盘块分配函数unsigned int balloc(){unsigned int free_block, free_block_num;int i;if( filsys.s_nfree == 0 ) // 磁盘已满,无空闲盘块{printf( "Disk has no space\n" );return -1;}free_block = filsys.s_free[filsys.s_pfree];if( filsys.s_pfree == 0 ) // 已经是栈底{// 读取栈底盘块号所对应的盘块数据bread( filsys.s_free[filsys.s_pfree], block_buf );free_block_num = block_buf[NICFREE]; // 该空闲盘块组的盘块数// 把盘块组放到空闲盘块号栈上for( i = 0; i < free_block_num; i++ )filsys.s_free[i] = block_buf[i];filsys.s_pfree = free_block_num - 1; // 指针指向栈顶}elsefilsys.s_pfree--; // 栈指针下移一位filsys.s_nfree--; // 空闲盘块少1// filsys.s_fmod = SUPDATE; // 置超级块修改标志return free_block;}// 空闲盘块回收函数bfree( unsigned int block_num ){int i;filsys.s_pfree++;if( filsys.s_pfree == NICFREE ) // 空闲盘块堆栈已满{block_buf[NICFREE] = NICFREE; // 空闲盘块堆栈的盘块数NICFREE记入缓冲区for( i = 0; i < NICFREE; i++ )block_buf[i] = filsys.s_free[i]; // 把空闲盘块数据写入缓冲区filsys.s_pfree = 0; // 栈指针指向栈底bwrite( block_num, block_buf ); // 缓冲区内容写入新回收的盘块}filsys.s_free[filsys.s_pfree] = block_num; // 回收盘块filsys.s_nfree++; // 空闲盘块多1// filsys.s_fmod = SUPDATE; // 置超级块修改标志}5、节点分配和释放函数:#include <stdio.h>#include "filsys.h"static struct dinode block_buf[BLOCKSIZ / DINODESIZ];struct inode * ialloc(){ struct filsys aaa;struct inode * temp_inode;unsigned int cur_di,temp;int i;if( filsys.s_ninode == 0 ) //没有空闲磁盘i节点{printf( "No leisure dinode!\n" );return NULL;}if( filsys.s_pinode == NICINOD ) //空闲磁盘i节点栈空{cur_di = filsys.s_rinode;if( filsys.s_ninode >= NICINOD ) //空闲磁盘i节点数可装满空闲i节点栈{filsys.s_pinode = 0;//把下一组磁盘i节点读进空闲磁盘i节点栈while( filsys.s_pinode < NICINOD ){fseek (fd, DINODESTART + cur_di * DINODESIZ, SEEK_SET);fread (block_buf, 1, BLOCKSIZ, fd);for( i = 0; ( i < BLOCKSIZ / DINODESIZ ) && ( filsys.s_pinode < NICINOD ); ){if( block_buf[i].di_mode == DIEMPTY )//该磁盘i节点空闲{filsys.s_inode[filsys.s_pinode] = cur_di;// 把该i节点装入空闲栈filsys.s_pinode++; // 栈指针下移一位}i++;cur_di++;}}filsys.s_pinode = 0;}else // 剩下的空闲磁盘i节点不能装满栈区{//计算出空闲栈指针装入i节点的第一个位置filsys.s_pinode = NICINOD - filsys.s_ninode;while( filsys.s_pinode < NICINOD ){fseek (fd, DINODESTART + cur_di * DINODESIZ, SEEK_SET);fread (block_buf, 1, BLOCKSIZ, fd);for( i = 0; ( i < BLOCKSIZ / DINODESIZ ) && ( filsys.s_pinode < filsys.s_ninode ); ){if( block_buf[i].di_mode == DIEMPTY ){filsys.s_inode[filsys.s_pinode] = cur_di;filsys.s_pinode++;}i++;cur_di++;}}filsys.s_pinode = NICINOD - filsys.s_ninode;}}//初始化磁盘i节点// temp_inode = iget( filsys.s_inode[filsys.s_pinode] );// temp_inode->i_number = 1;// temp_inode->i_uid = user[user_id].u_uid;// temp_inode->i_gid = user[user_id].u_gid;// temp_inode->i_size = 0;// temp_inode->i_addr[0] = 0;// iput( temp_inode );// 分配内存i节点temp_inode = iget( filsys.s_inode[filsys.s_pinode] );// 从磁盘i节点读取数据到内存i节点fseek( fd, DINODESTART + filsys.s_inode[filsys.s_pinode] * DINODESIZ, SEEK_SET );fwrite( &temp_inode->i_number, 1, sizeof(struct dinode), fd );filsys.s_pinode++; // 栈指针下移一位filsys.s_ninode--; // 空闲磁盘i节点又少了一个// filsys.s_fmod = SUPDATE; // 置超级块修改标志aaa=filsys;return temp_inode;}ifree(unsigned int dinodeid){filsys.s_ninode++; // 空闲磁盘i节点加1if( filsys.s_pinode != 0 ) // 空闲磁盘i节点栈未满{// 直接回收filsys.s_pinode--;filsys.s_inode[filsys.s_pinode] = dinodeid;}else // 空闲磁盘i节点栈已满{if( dinodeid < filsys.s_rinode ) // 磁盘i节点号小于铭记i节点号{filsys.s_inode[0] = dinodeid; // 回收filsys.s_rinode = dinodeid; // 把新回收的i节点作为铭记i节点}}}四、运行结果(含运行及测试结果和用户指南)1.注册用户和登录用户操作界面截图如下:通过login函数注册一个用户,并用该用户登录,可以使用户继续运行接下来的程序,有利于识别用户。

相关文档
最新文档