基于C++实现简易UNIX二级文件系统

📅 发布时间:2026/7/4 18:14:19 👁️ 浏览次数:
基于C++实现简易UNIX二级文件系统
一、实验概述1.1 实验目的UNIX 文件系统提供了层次结构的目录和文件负责系统内文件信息的管理是 UNNIX 系统中极为重要的一个部分。本次实验的目的是通过模拟 UNIX V6 编写一个 UNIX 文件系统实现基本文件操作从而掌握 UNIX 文件系统结构。1.2 实验要求使用一个普通的大文件如 c: myDisk.img称之为一级文件来模拟 UNIX V6 一个文件卷把一个大文件当一张磁盘用。1.2.1 图 1: 文件卷结构一个文件卷实际上就是一张逻辑磁盘磁盘中存储的信息以块为单位每块 512 字节。1.2.2 图 2: 使用文件卷模拟逻辑磁盘磁盘文件结构定义自己的磁盘文件结构SuperBlock 结构磁盘 Inode 节点结构包括索引结构磁盘 Inode 节点的分配与回收算法设计与实现文件数据区的分配与回收算法设计与实现文件目录结构目录文件结构目录检索算法的设计与实现文件打开结构磁盘高速缓存选作文件操作接口fformat格式化文件卷ls 列目录mkdir 创建目录fcreat 新建文件fopen 打开文件fclose 关闭文件fread 读文件fwrite 写文件flseek 定位文件读写指针fdelete 删除文件……主程序格式化文件卷用 mkdir 命令创建子目录建立如图所示的目录结构图 3: 文件目录结构把你的课设报告关于课程设计报告的 ReadMe.txt 和一张图片存进这个文件系统分别放在/home/texts /home/reports 和 /home/photos 文件夹图形界面或者命令行方式等待用户输入根据用户不同的输入返回结果。通过命令行方式测试新建文件 /test/Jerry 打开该文件任意写入 800 个字节将文件读写指针定位到第 500 字节读出 500 个字节到字符串 abc 。将 abc 写回文件。观察结果是否正确并详细解释每一步的工作过程1.3 设计报告要求实验报告内容需求分析10%说明程序任务包括输入、输出形式程序功能。概要设计15%任务分解数据结构定义模块间的调用关系算法说明等。详细设计30%重点函数的重点变量需说明重点功能部分要绘制清晰的程序流程图。画出函数调用关系。运行结果分析30%程序运行结果展示说明测试命令及输出结果结果分析。用户使用说明5%实验总结5%包括综合实验过程的收获、遇到问题及解决问题过程的思考、在综合实验过程中对课程的认识等内容。评分标准视系统及实验报告的完成情况不及格良加分项完成下列内容之一实现内存高速缓存实验报告中需说明缓存数据结构与管理算法允许多个用户同时访问二级文件系统1.4 实验环境操作系统Windows 10 家庭版开发语言C 编译器Microsoft Visual Studio Community 2019二、需求分析2.1 程序输入形式根据对题目要求分析和用户使用分析文件系统采用控制台命令作为输入按照系统给定的命令即可完成相应的功能。本文件模拟系统使用尽可能详细的控制台引导用户输入指令。用户可以在控制台输入的指令如下HELP———–帮助文档。ATTRIB———显示或更改文件属性。CD————-显示当前目录的名称或将其更改。DEL————删除至少一个文件。DIR————显示一个目录中的文件和子目录。EXIT———–退出文件系统。MKDIR———-创建一个目录。RMDIR———-删除目录。PRINT———-打印文件内容。WRITE———-向文件中写入内容OPEN———–打开一个文件CLOSE———-关闭一个文件CREATE———创建一个文件OPENLIST——-当前打开文件列表FSEEK———-更改一个文件的指针LOGOUT———用户退出登录WHOAMI———显示当前用户信息FORMAT———格式化文件卷REGISTER——-用户注册DELETEACCOUNT–删除用户root 用户下SU————-改变用户CHGRP———-改变用户所属组root 用户下USERLIST——-显示所有用户信息root 用户下使用 help 命令查看各个指令的详细内容如下ATTRIB 显示或更改文件属性。图 4: ATTRIB 指令CD 显示当前目录的名称或将其更改。图 5: CD 指令DEL 删除至少一个文件。图 6: DEL 指令DIR 显示一个目录中的文件和子目录。图 7: DIR 指令EXIT 退出文件系统。图 8: EXIT 指令MKDIR 创建一个目录。图 9: MKDIR 指令RMDIR 删除目录。图 10: RMDIR 指令PRINT 打印文件内容。图 11: PRINT 指令WRITE 向文件中写入内容图 12: WRITE 指令OPEN 打开一个文件图 13: OPEN 指令CLOSE 关闭一个文件图 14: CLOSE 指令CREATE 创建一个文件图 15: CREATE 指令OPENLIST 当前打开文件列表图 16: OPENLIST 指令FSEEK 更改一个文件的指针图 17: FSEEK 指令LOGOUT 用户退出登录图 18: LOGOUT 指令WHOAMI 显示当前用户信息图 19: WHOAMI 指令FORMAT 格式化文件卷图 20: FORMAT 指令图 21: REGISTER 指令DELETEACCOUNT 删除用户root 用户下图 22: DELETEACCOUNT 指令SU 改变用户图 23: SU 指令CHGRP 改变用户所属组root 用户下图 24: CHGRP 指令USERLIST 显示所有用户信息root 用户下图 25: USERLIST 指令2.2 程序输出形式程序通过控制台命令行交互的方式进行用户输入引导和显示反馈输出具体输出将在后续进行介绍。图 26: 程序输出2.3 程序功能实验模拟 UNIX 文件操作系统实现了多用户下文件的一系列操作。具体可以实现的功能如下所示多用户下文件的创建、删除多用户下文件的打开、关闭、读、写、读写指针移动当前打开文件列表的显示多用户下更改文件读写属性权限多用户下目录的创建、删除多用户下目录的更改一个目录下文件和子目录的显示用户的创建、删除用户的登录、退出、更改修改用户所属组显示当前用户信息显示所有用户信息格式化文件卷退出文件系统帮助文档三、概要设计3.1 任务分解整个多用户文件系统可以划分为以下几个模块内存管理模块主要负责 SuperBlock、Inode、Block 的初始化、申请和释放。提供读入读出 SuperBlock、Inode、Block 块以及申请释放 Block 块的接口同时提供每个 Inode 中逻辑 Block 块号和物理 Block 块号映射关系转换接口。文件管理模块主要负责文件相关的一系列操作。提供创建文件、删除文件、显示文件列表、打开文件关闭文件、写文件、读文件、更改文件指针、更改文件权限等操作的相关接口。用户管理模块主要负责用户相关的一系列操作。提供用户登录、用户登出、创建用户、删除用户、获取当前登录用户信息、更改用户所属组、输出用户列表信息等操作的相关接口。目录管理模块主要负责文件目录相关的一系列操作。提供创建目录、删除目录、打开目录、获取当前目录等操作的相关接口顶层管理模块主要负责用户输入信息处理、将用户输入命令转化为内核操作、反馈信息输出、错误反馈等。3.2 数据结构定义整个文件系统包含以下几个数据结构的定义Inode 结构体Inode 结构体中存储一个 Inode大小为 64 字节4 个 Inode 占满一个 BLock 块。其内部有两个枚举类型 INodeMode 和 INodePermission分别用于枚举 Inode 指向的为文件还是目录、该目录/文件的读写属性其中读写属性分为文件主、文件主同组和其他用户三组OWNER_R 为文件主可读OWNER_W 为文件主可写OWNER_E 为文件主可执行GROUP_R 为文件主同组可读GROUP_W 为文件主同组可写GROUP_E 为文件主同组可执行ELSE_R 为其他用户可读ELSE_W 为其他用户可写ELSE_E 为其他用户可执行。Inode 结构体主要包含的成员如下i_addr 用于文件逻辑块和物理块的映射其映射关系如图 27 所示最多可以容纳 1281282128*26 个 Block 块。i_size 存储文件大小以自己为单位目录大小统一设置为 0i_count 为当前文件被打开的引用计数 i_number 为当前 Inode 的编号i_permission 为文件的读写权限其值为 OWNER_R、 OWNER_W、OWNER_E、GROUP_R、GROUP_W、GROUP_E、ELSE_R、ELSE_W、 ELSE_E 的组合当 i_permission 与这几个值与运算后不为 0则代表当前 Inode 拥有这一权限i_uid 为文件/目录创建者用户 idi_gid 为文件/目录创建者用户组 id i_time 为文件最后访问时间。图 27: i_addr 索引图//Inode 结构体 struct Inode { enum INodeMode { IFILE 0x1, //是文件 IDIRECTORY 0x2//是目录 }; enum INodePermission {//分为文件主、文件主同组和其他用户 OWNER_R 0400, OWNER_W 0200, OWNER_E 0100, GROUP_R 040, GROUP_W 020, GROUP_E 010, ELSE_R 04, ELSE_W 02 , ELSE_E 01 , }; unsigned int i_addr [NINODE] ; //逻辑块号和物理块号转换的索引表 unsigned int i_size ; //文件大小字节为单位 unsigned short i_count ; //引用计数 unsigned short i_number ; //Inode 的编号 unsigned short i_mode ; //文件工作方式信息 unsigned short i_permission ; //文件权限 unsigned short i_uid ; //文件所有者的用户标识 unsigned short i_gid ; //文件所有者的组标识 }; time_t i_time ; //最后访问时间SuperBlock 结构体SuperBlock 结构体中存储整个文件的 SuperBlock文件系统超级块。其中包含以下成员s_inodenum 存储 Inode 总数s_finodenum 存储空闲 Inode 数s_blocknum 存储 Block 总数s_fblocknum 存储空闲 Block 数s_nfree 和 s_free 通过成组链接法管理所有空闲 Block每一组的最大空闲 Block 数为 50其中 0 号位用于存储下一个空闲表位置。// SuperBlock 结构体 struct SuperBlock { unsigned short s_inodenum ; //Inode 总数 unsigned short s_finodenum ; //空闲 Inode 数 unsigned short s_blocknum ; // Block 总数 unsigned short s_fblocknum ; //空闲 Block 数 unsigned int s_nfree ; //直接管理的空闲块数 unsigned int s_free [FREE_BLOCK_GROUP_NUM] ; //空闲块索引表 };Directory 结构体Directory 结构体用于存储目录列表对于一个 i_mode 为 IDIRECTORY 的 Inode其 i_addr[0] 中所指向的 Block 存储一个 Directory该 Directory 结构体中的信息即为该目录的信息。Directory 结构体有两个成员 d_inodenumber 和 d_filename分别用于存储该目录下的文件/目录的 Inode 号和名称。// Directory 结构体 struct Directory { unsigned int d_inodenumber [SUBDIRECTORY_NUM] ; //子目录Inode 号 char d_filename [SUBDIRECTORY_NUM] [FILE_NAME_MAX] ; //子目录文件名 };User 结构体User 结构体中存储所有的用户信息。User 结构体放置在 1 号 Block 中。User 结构体包含四个成员u_id 存储用户 id、u_gid 存储用户所在组 id、u_name 存储用户名、u_password 存储用户密码。用户 i 信息不存在时则 u_name[i] 为空。//User 结构体 struct User { unsigned short u_id [USER_NUM] ; //用户 id unsigned short u_gid [USER_NUM] ; //用户所在组 id char u_name[USER_NUM] [USER_NAME_MAX] ; //用户名 char u_password [USER_NUM] [USER_PASSWORD_MAX] ; //用户密码 };File结构体File 结构体存储打开文件信息。其包含的成员如下f_inodeid 为文件的 inode 编号、f_offset 为文件的读写指针位置、f_uid 为文件打开用户。File 结构体伴随打开文件和关闭文件存在消失。// File 结构体 struct File { unsigned int f_inodeid ; //文件的 inode 编号 unsigned int f_offset ; //文件的读写指针位置 unsigned int f_uid ; //文件打开用户 };3.3 模块间调用关系文件系统 myDisk.img 的空间分配如图 28 所示图 28: myDisk.img 的空间分配各个模块之间的调用关系如图 29 所示图 29: 模块间调用关系图3.4 算法说明整个算法的整体流程如图所示图 30: 整体流程图其中根据命令执行操作的流程具体如下HELP根据 help 后有无参数以及参数名选择不同的提示输出。具体可参考 2 需求分析模块ATTRIB首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Edit_File_Permission 函数更改文件权限。CD首先检查命令输入的正确性若不正确则输出错误信息若输入正确则如果 cd 后有参数则根据参数调用 Open_Directory 函数更改文件目录如果 cd 后无参数则输出当前所在目录。DEL首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数逐一调用 Delete_File 函数删除文件。DIR首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Show_File_List 函数显示文件信息。EXIT首先检查命令输入的正确性若不正确则输出错误信息若输入正确则退出程序。MKDIR首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Create_Directory 函数创建文件。RMDIR首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Remove_Directory 函数删除目录。PRINT首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Read_File 函数将文件内容读出到文件或屏幕。WRITE首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Write_File 函数将文件或屏幕内容写入文件。OPEN首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Open_File 函数打开文件。CLOSE首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Close_File 函数打开文件。CREATE首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Create_File 函数打开文件。OPENLIST首先检查命令输入的正确性若不正确则输出错误信息若输入正确则遍历输出所有打开文件信息。FSEEK首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Seek_File 函数更改文件指针。LOGOUT首先检查命令输入的正确性若不正确则输出错误信息若输入正确则调用 User_Logout 函数使用户登出。WHOAMI首先检查命令输入的正确性若不正确则输出错误信息若输入正确则调用 Get_User 函数输出当前用户信息。FORMAT首先检查命令输入的正确性若不正确则输出错误信息若输入正确则调用 Init 函数初始化文件卷。REGISTER首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用User_Register 函数进行用户注册。DELETEACCOUNT首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用User_Delete 函数删除文件。SU首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用User_Logout 函数和 User_Login 函数更改用户。CHGRP首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Change_User_Group 函数更改用户组。USERLIST首先检查命令输入的正确性若不正确则输出错误信息若输入正确则根据参数调用Show_User_List 函数展示用户表。四、详细设计顶层管理模块所涉及的部分已在前几部分进行了一定说明下面对内存管理模块、目录管理模块、文件管理模块和用户管理模块的详细设计进行说明。4.1 内存管理模块4.1.1 内存块读写在文件操作的过程中经常需要对 SuperBlock 块、Inode 块、User 表等部分进行读写因此分离出 Read_SuperBlock、Write_SuperBlock、Read_InodeBitMap、Write_InodeBitMap、Read_User、Write_User、Read_Inode、Write_Inode 几个函数对内存进行读写。其流程图如图 31 所示4.1.1 图 31: 内存块读写4.1.2 分配一个 Block 块空闲盘块采用成组链接法进行管理如图 32其流程图如图 33 所示。4.1.2 图 32: 成组链接法图 33: 分配一个 Block 块4.1.3 回收一个 Block 块回收 Block 块为分配 Block 块的逆过程两者流程相似。//如果该空闲块已满需要使 superblock 指向一个新的空块 i f ( superblock . s_nfree FREE_BLOCK_GROUP_NUM 1) { fd . open(DISK_NAME,ios : : out | ios : : in | ios : :binary ) ; fd . seekg ((BLOCK_POSITION block_num) BLOCK_SIZE, ios : : beg ) ; fd . write (( char )superblock . s_free, sizeof ( superblock . s_free ) ) ; fd . close () ; superblock . s_free [ 0 ] block_num ; superblock . s_nfree 0; superblock . s_fblocknum; } else { superblock . s_nfree; superblock . s_free [ superblock . s_nfree ] block_num ; }4.1.4 Inode 中逻辑块号与物理块号的映射小型文件的索引结构小型文件使用文件素引表中 i_addr[0]-i_addr[5] 这 6 项作为直接索引表也就相当于限制了小型文件长度范围是 0-6 个数据块每个盘块大小等于 512 字节。其中文件逻辑块号 n 对应的物理块号记录在 i_addr[n] 中。譬如i_addr[2] 的值为 2058 表示该文件的第 3 块数据 (偏移量 1024 1535 字节) 占据的物理盘块编号为 2058。大型文件的索引结构当文件的长度超出小型文件限制时就需要采用大型文件的素引结构。大型文件除了使用 i_addr[0]-i_addr[5] 记录该文件前 6 个物理块号之外还用到 i_addr[6]、i_addr[7] 两项每一项指向一个含有物理块号明细的一次间接索引表块每个一次间接索引表块可以容纳 512/4-128 个物理块号, 可为 128 个文件的逻辑块和物理块建立对应关系。因此大型文件的长度范围是 7 (6 128 *2) 个数据块。如果内核需要通过一次间接索引表块访问数据, 那么先要将一次间接索引表块读入内存从中找到逻辑块号对应的物理块号然后再读取该物理块上的文件数据。巨型文件的索引结构如果文件长度比大型文件还要大则除了用到基本素引表中的 i_addr[0]-i_addr[5] 以及i_addr[6]、i_addr[7] 两项记录该文件前 12826 个物理块号之外, 还要使用 i_addr[8]、 i_addr[9] 来记录二次间接索引表块的物理共号。二次间接索引表块的作用类似于一次间接索引表表中的每一项都记录者它所指向的一个一次间接索引表块的物理块号然后再由该一次间接索引表块中的各项记录文件数据的物理块号。每张二次间接索引表块最多可记录 128 个一次间接索引表的物理块号因此巨型文件的长度范围为(12827) (128128212826)。4.2 目录管理模块4.2.1 创建目录创建目录的流程图 34 如图所示创建目录成功的前提是目录名合法、有空闲的 block 和 inode、当前目录不存在同名目录、当前目录的文件数量未达到限制4.2.1 图 34: 创建目录流程图4.2.2 删除目录删除目录的流程图如图 35 所示删除目录的前提是目录名合法、目录为空。4.2.2 图 35: 删除目录流程图4.2.3 打开目录打开一个目录需要根据目录路径一级级进入相应的位置目录路径使用’ 或 ’/’ 进行分割’.’ 代表当前目录’..’ 代表父目录根据目录名寻找到 Inode 号进而更改对应的 directory 即可完成目录的切换4.2.4 获取当前目录从当前目录向上级目录一层层进行寻找并使用’ 进 行连接即可完成当前目录的获取4.3 文件管理模块4.3.1 创建文件创建文件的流程图如图所示创建文件成功的前提是文件名合法、有空闲的 block 和 inode、当前目录不存在同名文件、当前目录的文件数量未达到限制图 36: 创建文件流程图4.3.2 更改文件指针在保证当前用户为文件打开用户、用户具有写权限的前提下更改 File 结构体中的 file-f_offset 即可4.3.3 读文件在保证当前用户为文件打开用户、用户具有写权限的前提下从 file-f_offset 指定位置开始依次取出 Block 块直至读出文件长度等于 length 或读到文件末尾在字符串末尾补尾零并返回读到字符串的长度。4.3.4 更改文件权限每个文件的权限共有三组分别为主用户、同组用户、和其他用户每一组用户权限又分为读权限、写权限以及执行权限在相应的 Inode 中修改 i_permission 属性即可对该权限进行修改。4.3.5 删除文件删除文件的流程图如图所示删除目录的前提是文件名合法、文件未被打开。4.3.5 图 37: 删除文件流程图4.3.6 打开文件首先检查文件名是否合法如果合法则在当前目录下寻找这一文件找到后新建 File 结构体在其中赋值 f_inodeid 为找到的 inode_numf_offset 为 0f_uid 为打开文件的用户 id并返回 file 结构体。4.3.7 写文件写文件的流程如图所示写文件需要保证当前用户为文件打开用户用户具有写权限。图 38: 写文件流程图4.4 用户管理模块4.4.1 登录用户检查用户名和密码若均正确即可进行登录若输入用户名错误则提示此用户不存在若输入密码错误则输出密码错误4.4.2 退出登录将全局的 user_id 改为-1即可完成用户登录的退出4.4.3 创建用户只有 root 用户可以进行用户的注册注册前需要先检查该用户名是否已经存在若存在则给出报错否则进行用户的新建。4.4.4 删除用户只有 root 用户可以进行用户的删除删除前需要先检查该用户是否存在若存在则进行用户的删除否则给出报错。4.4.5 改变用户所属组只有 root 用户可以进行用户所属组的更改更改前需要先检查该用户是否存在若存在则进行用户的所属组更改否则给出报错。五、运行结果分析5.1 运行结果5.1.1 在初次打开 exe文件系统不存在的情况下会提示用户进行文件系统的初始化5.1.2 图 39: 初始界面随后提示需要进行登录并输入用户名和密码默认情况下存在两个用户root 用户拥有最高权限、juju 用户普通用户)此时使用 root 用户登录5.1.3 图 40: 成功登录对一些基本命令进行测试详细测试将在下一部分进行展示图 41: 用户相关命令图 42: help 命令图 43: 文件及目录相关测试5.2 命令测试5.2.1 课设要求测试用 mkdir 命令创建子目录建立如图所示的目录结构图 44: 目录结构-1图 45: 目录结构-2把你的课设报告关于课程设计报告的 ReadMe.txt 和一张图片存进这个文件系统分别放在/home/texts /home/reports 和 /home/photos 文件夹使用如下的命令将 ReadMe.txt 放入/home/textscd home/ texts create readme . txt open readme . txt1 2 3图 48: 放入 report.pdfwrite readme . txt f ReadMe. txt close readme . txt4 5图 46: 将 ReadMe.txt 放入/home/texts使用如下的命令将 readme.txt 中的内容再次写出cd home/ texts open readme . txt print readme . txt p tmp. txt fseek readme . txt 0 close readme . txt1 2 3 4 5比对两个文件完全一致证明了程序的正确性。图 47: 文件比对进一步进行其他两个文件的放入新建文件 /test/Jerry 打开该文件任意写入 800 个字节图 49: 创建文件并写入 800 字节由图 49成功创建文件并进行了写入。将文件读写指针定位到第 500 字节读出 500 个字节并写回到文件图 50: 定位读写指针并写回文件可以看到与预期相同写入了 300 个字节图 51: jerryfile.txt再将其写回到文件图 52: 写回文件可以看到与预期相同jerry 目前共由 1100 个字节5.2.2 命令逐条测试对命令进行逐一测试HELP———–帮助文档。图 53: help 命令测试ATTRIB———显示或更改文件属性。图 54: 更改文件读写属性CD————-显示当前目录的名称或将其更改。图 55: 更改目录DEL————删除至少一个文件。图 56: 删除文件DIR————显示一个目录中的文件和子目录。图 57: 显示目录中内容MKDIR———-创建一个目录。图 58: 创建目录RMDIR———-删除目录。图 59: 删除目录PRINT———-打印文件内容。图 60: 打印文件内容WRITE———-向文件中写入内容图 61: 向文件写入OPEN———–打开一个文件图 62: 打开文件CLOSE———-关闭一个文件图 63: 关闭文件CREATE———创建一个文件图 64: 创建一个文件OPENLIST——-当前打开文件列表图 65: 打开文件列表FSEEK———-更改一个文件的指针图 66: 更改文件定位指针LOGOUT———用户退出登录图 67: 用户登出WHOAMI———显示当前用户信息图 68: 显示当前用户信息REGISTER——-用户注册root 用户下图 69: 用户注册DELETEACCOUNT–删除用户root 用户下图 70: 删除用户SU————-改变用户图 71: 改变用户CHGRP———-改变用户所属组root 用户下图 72: 改变用户所属组USERLIST——-显示所有用户信息root 用户下图 73: 显示用户信息5.2.3 其他测试多用户读写测试– 首先用户 juju 在文件 test.txt 中写入 juju5.2.3 图 74: 多用户读写测试-1– 随后用户 root 打开同一个文件 test.txt在其中写入 root5.2.3 图 75: 多用户读写测试-2可以看到root 用户在刚进入文件系统时可以看到 juju 写入的 4 个字节随后 root 用户写入 root 将 juju 覆盖– 此时 juju 再次进行文件的读读到的是 root 用户写入的 root5.2.3 图 76: 多用户读写测试-3– juju 继续向文件中写入 juju5.2.3 图 77: 多用户读写测试-4– 此时 root 用户再次读5.2.3 图 78: 多用户读写测试-5由图可知juju 写入的 juju 四个字符已被 root 用户读到因此可以得出结论该文件系统支持多个用户同时读写。大文件读写从网上下载简爱英文版图 79: txt 格式简爱可以看到其共有 287871 字节将其写入文件图 80: 大文件测试-1将其读出到屏幕图 81: 大文件测试-2将输出内容与文件进行比对两者完全相同图 82: 大文件测试-3 因此可以得出结论该系统可以进行大文件的读入读写权限测试root 用户创建文件并更改其权限为除自己与同组用户外都不可读写5.2.3 图 83: 读写权限测试-15.2.3 图 84: 读写权限测试-2– 切换到 juju 用户与 root 非同组图 85: 读写权限测试-3 可以看到系统提示 juju 无权进行写操作5.3 结果分析由 5.1 及 5.2 可知程序具有正确的运行结果并在用户命令输入不当时可以进行正确的报错同时可以对用户输入命令给予良好的引导整个程序完整清晰具有友好性和正确性六、用户使用说明项目结构图 86: 项目结构运行方法在 Windows 下直接点击生成的 exe 文件执行Linux 下可以将源程序放在集成环境下编译也可利 GNU 编译工具通过写好的 Makefile 进行编译。运行界面为控制台的命令行方式命令较为简单通俗易懂初始界面如下图 87: 初始界面具体命令的使用方法可以通过输入 [ help 命令名] 进行查看系统初始化后的文件结构如下root –bin –etc –home —-texts —-reports —-photos –dev 最初进入系统时包含两个用户root 用户和 juju 用户其中 root 用户为最高权限用户可以进行注册用户、删除用户、改变用户所属组、显示用户信息等操作juju 为普通用户 root 用户密码为 rootjuju 用户密码为 juju该文件系统在节点数量等上具有一定限制用户的最大数量为 6文件及目录个数最多为 256一个目录下的子目录与文件数之和最多为 12文件名称的最大长度为 32用户名称的最大长度为 16用户密码的最大长度为 32 程序正常退出使用 exit 命令格式化使用 format 命令。参考文献尤晋元,UNIX 操作系统教程 [M] 西安: 电子科技大学出版社,1985 年 6 月Unix v6 源码同济大学操作系统课程电子教案♻️ 资源大小5.59MB➡️资源下载https://download.csdn.net/download/s1t16/87415717注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除