文件系统(操作系统实验)

实验内容

(1)在内存中开辟一个虚拟磁盘空间作为文件存储器, 在其上实现一个简单单用户文件系统。 在退出这个文件系统时,应将改虚拟文件系统保存到磁盘上, 以便下次可以将其恢复到内存的虚拟空间中。

(2)要求提供有关操作:format, create, rm, mkdir, rmdir, ls…

format:对文件存储器进行格式化,即按照文件系统对结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。

mkdir:用于创建子目录;

rmdir:用于删除目录;

ls:用于显示目录;

cd:用于更改当前目录;

create:用于创建文件;

open:用于打开文件;

close:用于关闭文件;

write:用于写文件;

read:用于读文件

rm:用于删除文件

实验原理:

磁盘分区方式:

superblock super; // 超级块FAT fat;           // FAT 表bitmap bm;         // 磁盘块的位识图inodemap im;       // 索引节点的位示图inode inodes[INODE_SUM]; // 索引节点inode root;               // 根目录的索引节点block blocks[BLOCK_SUM]; // 其他索引节点

文件管理系统数据成员:

disk *diskptr;                          // 管理的虚拟磁盘char *filepath;                         // 虚拟磁盘保存的位置Buf wdir;                               // 工作目录Buf wfile;                              // 文件操作缓冲区Filebuf wprt[10];                       // 读写指针int cur_blockid = 0;                    // 当前工作目录下的第一个盘块int cur_inode = -1;                     // 当前工作目录下的索引节点string workpath;

算法思路:

用FAT表对磁盘块进行链接存储,索引节点和磁盘块均采用位示图的方式进行管理和分配根节点的索引节点号为 -1。

对文件或者目录进行修改删除时,均先切换到对应得目录下再进行操作,执行完毕后再返回原来得工作目录。

程序退出时先将虚拟磁盘写回到目录再退出。

编译执行命令: g++ -o main *.cpp && ./main

效果展示

列出当前目录项得文件和文件夹

查看文件内容

创建文件夹

删除文件夹

创建文件,并读写文件

程序退出时保存原来得磁盘情况

保存的磁盘文件 16进制展示

超级块和部分FAT表

部分根目录:

保存的部分文件内容

保存的磁盘文件大小:

部分源码

data.hpp

#pragma once
#define BLOCK_SIZE 512      // 磁盘块大小 512 B
#define ENTRIES_PER_BLOCK 4 // 每个磁盘块最多 4 个目录项
#define BLOCK_SUM 2048      // 磁盘块数
#define INODE_SUM 2048      // 索引节点数
#define DIRSTY 0            // 目录
#define FILESTY 1           // 普通文件
#define READ 1              // 读权限
#define WRITE 2             // 写权限

disk.hpp

#pragma once
#include "data.hpp"class superblock
{
public:int block_sum; // 盘块的数量int inode_sum; // 索引节点的数量superblock();
};class FAT
{
public:int next[BLOCK_SUM]; // 链表法FAT();
};class bitmap
{
public:char map[BLOCK_SUM / 8]; // 位示图bool empty(int no);      // 判断磁盘块是否分配void set(int);           // 将磁盘块置为已分配void free(int);          // 回收磁盘块bitmap();                // 初始化,全部为未分配int get();               // 申请一个磁盘块,成功则返回磁盘块号,否则返回 -1
};class inodemap
{
public:char map[INODE_SUM / 8];bool empty(int no); // 返回当前节点是否为空void set(int);void free(int);inodemap(); // 初始化位示图int get();
};class inode
{
public:int firstblock; // 第一个盘块号int type;       // 文件类型
};class entry
{
public:bool flag;      // 目录项是否有效char name[123]; // 文件名int node;       // 索引节点号entry();
};union block // 磁盘块,有两种组织形式,普通文件目录的形式
{
public:char data[BLOCK_SIZE];entry entries[ENTRIES_PER_BLOCK];block();
};class disk
{
public:superblock super;FAT fat;bitmap bm;inodemap im;inode inodes[INODE_SUM];inode root;block blocks[BLOCK_SUM];disk();
};

FS.hpp

#pragma once
#include <string>
#include "disk.hpp"
using std::string;union Buf // 缓存区,主要用于将目录、文件放到缓冲区处理
{entry entries[4096];char data[524288];block blocks[512];Buf();
};class Filebuf // 读文件工作区,保存已经打开的文件及权限
{
public:bool flag = false;inode fnode;char mod = 0;char name[123];int fafblock; // 父目录的第一个盘块
};class FS
{disk *diskptr;                          // 管理的虚拟磁盘char *filepath;                         // 虚拟磁盘保存的位置Buf wdir;                               // 工作目录Buf wfile;                              // 文件操作缓冲区Filebuf wprt[10];                       // 读写指针int cur_blockid = 0;                    // 当前工作目录下的第一个盘块int cur_inode = -1;                     // 当前工作目录下的索引节点void loadbuf(int firstblock, Buf &buf); // 载入缓冲区,可以执行工作目录和文件操作缓冲区的加载void writebackdir(int firstblock);      // 写回目录,常常在切换工作目录时写回void writebackfile(int firstblock);     // 写回文件,完成写文件后写回void delfile(int firstblock);           // 删除文件,包括目录和普通文件/*------------------ 原子操作(只允许在当前目录下操作) --------------------------------------*/int cd(const char *);      // 切换目录,原子操作,返回 1 表示没有该目录void create(const char *); // 创建文件void rmdir(const char *);  // 删除文件void mkdir(const char *);  // 创建目录void ls();                 // 列出当前目录下的文件和文件夹string getfolerpath(string);string getfilename(string);public:string workpath;FS(char *file); // 对磁盘格式化,或导入已有的磁盘文件~FS();          // 写回磁盘并保存/*------------------ 原子操作(只允许在当前目录下操作) --------------------------------------*/int open(const char *, char mod); // 返回一个 wptr,只能打开当前目录的文件void write(int, const char *);    // 写文件,第一个参数为写指针,第二个参数为写的内容void close(int);                  // 关闭文件void read(int);                   // 读文件,参数为读指针void rm(int);                     // 删除文件,需要先打开文件才能删除/*--------------------- 允许任何在路径下操作(只有changedir 会改变工作路径)------------------------------*/int changedir(const char *);                // 切换工作目录void createfile(const char *);              // 创建文件,参数为文件路径void removedir(const char *);               // 删除文件夹,参数为文件夹路径void list(const char *);                    // 列出指定目录下的文件和文件夹void makedir(const char *);                 // 创建文件夹,参数为文件夹路径int openfile(const char *, char);           // 打开指定文件,第二个参数为读写权限,返回读写指针void writefile(const char *, const char *); // 写文件,第一个参数为文件路径,第二个为写入内容void readfile(const char *);                // 读文件void removefile(const char *);              // 删除文件
};

main.cpp

#include <iostream>
#include <string>
#include "FS.hpp"
using namespace std;char file[] = "./FileSys";
FS fs(file);int main()
{cout << "/>";string op;string contxt;string par;int wptr;while (cin >> op){if (op == "ls"){char a = getchar();if (a == '\n'){char path[] = ".";fs.list(path);}else{cin >> par;fs.list(par.c_str());}}if (op == "cd"){cin >> par;fs.changedir(par.c_str());}if (op == "touch"){cin >> par;fs.createfile(par.c_str());}if (op == "mkdir"){cin >> par;fs.makedir(par.c_str());}if (op == "rmdir"){cin >> par;fs.removedir(par.c_str());}if (op == "open"){cin >> par;wptr = fs.openfile(par.c_str(), READ | WRITE);}if (op == "write"){cin >> par;char line[524288];contxt = "";cin.get();cin.getline(line, 524288, '\n');cin.clear();while (string(line) != "EOF"){contxt += string(line) + '\n';cin.getline(line, 1024, '\n');cin.clear();}fs.writefile(par.c_str(), contxt.c_str());}if (op == "cat"){cin >> par;fs.readfile(par.c_str());}if (op == "rm"){cin >> par;fs.removefile(par.c_str());}if (op == "quit")break;if (op == "close"){fs.close(wptr);}cout << fs.workpath << ">";}
}

doc.txt(转载自China Daily)

Precipitation on Tibetan Plateau underestimated
By YAN DONGJIE | China Daily | Updated: 2024-06-07 09:17
Precipitation across the Tibetan Plateau, which is known as Asia's water tower, has been significantly underestimated, Chinese researchers said in a paper published in the Proceedings of the National Academy of Sciences late last month.
The researchers, from the Chinese Academy of Sciences' Institute of Tibetan Plateau Research, said the underestimation is caused by the measuring instruments used and the method of calculation, and called for a "redesigned precipitation observation strategy" to remedy it.
A substantial proportion of precipitation over the plateau falls as snow, often accompanied by strong winds.
The researchers said ground-based instrument monitoring is widely regarded as the primary and most reliable technique for acquiring precipitation data, but traditional ground-level precipitation gauges have a limited cross-section in the collection cylinder and a sealed bottom.
"This design results in the formation of upward supporting airflow under windy conditions, which in turn prevents raindrops or snowflakes from entering the gauge cylinder. Consequently, this leads to an underestimation of precipitation in this region," said Miao Chiyuan from Beijing Normal University, the first author of the study.
Miao said the instrument measurement error caused by strong winds is the primary factor affecting the accuracy of precipitation measurements in high-altitude regions, with errors under extreme weather conditions potentially exceeding 100 percent.
Apart from the equipment, variations in altitude can cause mistakes in the data collected. Weather stations in the region are often placed in valleys or lower areas for convenience, which means they miss out on precipitation that occurs at higher elevations. Additionally, the limited number of stations and their uneven distribution can make the data even less accurate, according to the study.
The Tibetan Plateau, home to more than 100,000 square kilometers of glaciers and 1 million sq km of frozen soil, serves as the source of 10 major Asian river systems flowing into 10 countries, and supports the lives of about 2 billion people.
"In the context of accelerated warming, precipitation across the Tibetan Plateau plays a critical role in water cycles. Accordingly, obtaining reliable precipitation information is a prerequisite for water cycle analysis, future climate projections, and water-related disaster risk assessments," said the institute's Li Xin, the corresponding author of the research.
EOF

file.txt

Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
snap
Desktop/lab1
Desktop/lab2
Desktop/lab3
Desktop/lab4
Desktop/lab5
snap/firefox
snap/firefox/3836
snap/firefox/4336
snap/firefox/common
snap/snapd-desktop-integration
snap/snapd-desktop-integration/83
snap/snapd-desktop-integration/common

存储大文件存在一点问题,自行修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365356.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-java连接MySQL数据库+JDBC的使用

目录 1.准备所需要资源 2.导入驱动包 3.连接数据库步骤 首先在MySQL中创建好数据库和表 代码实现连接数据库 1.准备所需要资源 1.mysql和驱动包 我用的是5.7的mysql和5.1.49的驱动包&#xff0c;链接放在网盘里&#xff0c;需要的自取 链接&#xff1a;https://pan.bai…

二轴机器人装箱机:重塑物流效率,精准灵活,引领未来装箱新潮流

在现代化物流领域&#xff0c;高效、精准与灵活性无疑是各大企业追求的核心目标。而在这个日益追求自动化的时代&#xff0c;二轴机器人装箱机凭借其较佳的性能和出色的表现&#xff0c;正逐渐成为装箱作业的得力助手&#xff0c;引领着未来装箱新潮流。 一、高效&#xff1a;重…

【自动化测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录 自动化测试一、selenium1.相关介绍1.Selenium IDE2.Webdriverwebdriver的工作原理&#xff1a; 3.selenium Grid 2.Selenium Java环境搭建3.常用API的使用1.定位元素2.操作测试对象3.添加等待4.打印信息5.浏览器的操作6.键盘事件7.鼠标事件8.定位一组元素9.多层框架定…

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息&#xff0c;在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…

HTTP协议和Nginx

一、HTTP协议和Nginx 1.套接字Socket 套接字Socket是进程间通信IPC的一种实现&#xff0c;允许位于不同主机&#xff08;或同一主机&#xff09;上不同进程之间进行通信和数据交换&#xff0c;SocketAPI出现于1983年BSD4.2实现在建立通信连接的每一端&#xff0c;进程间的传输…

【单元测试】Controller、Service、Repository 层的单元测试

Controller、Service、Repository 层的单元测试 1.Controller 层的单元测试1.1 创建一个用于测试的控制器1.2 编写测试 2.Service 层的单元测试2.1 创建一个实体类2.2 创建服务类2.3 编写测试 3.Repository 1.Controller 层的单元测试 下面通过实例演示如何在控制器中使用 Moc…

Uniapp 默认demo安装到手机里启动只能看得到底tab无法看到加载内容解决方案

Uniapp 默认demo安装到手机里以后&#xff0c;启动APP只能看到底tab栏&#xff0c;无法看到每个tab页对应的内容&#xff0c;HBuilder会有一些这样的报错信息&#xff1a; Waiting to navigate to: /pages/tabBar/API/API, do not operate continuously: 解决方案&#xff1a;…

OpenCV 调用自定义训练的 YOLO-V8 Onnx 模型

一、YOLO-V8 转 Onnx 在本专栏的前面几篇文章中&#xff0c;我们使用 ultralytics 公司开源发布的 YOLO-V8 模型&#xff0c;分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务&#xff0c;实验后发现效果都非常的不错&#xff0c;但是前面的演示都是基于 ultralytics…

SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问

本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。 我测试的版本是,其他版本不确定是否也正常,测试过没问题的小伙伴,可以在评论区将测试过的版本号留下,方便他人参考: <spring-boot.version>2.3.12.RELEASE</spring-boot.vers…

快速将网页封装成APP:小猪APP分发助您一臂之力

你是否曾经有一个绝妙的网页&#xff0c;但苦于无法将其变成手机APP&#xff1f;其实&#xff0c;你并不孤单。越来越多的企业和开发者希望将自己的网站封装成APP&#xff0c;以便更好地接触到移动端用户。我们就来聊聊如何快速将网页封装成APP&#xff0c;并探讨小猪APP分发在…

「C++系列」C++ 数据类型

文章目录 一、C 数据类型二、C 数据类型占位与范围三、类型转换1. 隐式类型转换&#xff08;Automatic Type Conversion&#xff09;2. 显式类型转换&#xff08;Explicit Type Conversion&#xff09;3. 示例代码 四、数据类型案例1. 整型2. 浮点型3. 字符型4. 布尔型5. 枚举类…

《Programming from the Ground Up》阅读笔记:p1-p18

《Programming from the Ground Up》学习第1天&#xff0c;p1-18总结&#xff0c;总计18页。 一、技术总结 1.fetch-execute cycle p9, The CPU reads in instructions from memory one at a time and executes them. This is known as the fetch-execute cycle。 2.genera…

九浅一深Jemalloc5.3.0 -- ①浅*编译调试

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。5.3.0的特性请见Releases jemalloc/jemalloc GitHub 另…

fastapi+vue3前后端分离开发第一个案例整理

开发思路 1、使用fastapi开发第一个后端接口 2、使用fastapi解决cors跨域的问题。cors跨域是浏览器的问题&#xff0c;只要使用浏览器&#xff0c;不同IP或者不同端口之间通信&#xff0c;就会存在这个问题。前后端分离是两个服务&#xff0c;端口不一样&#xff0c;所以必须要…

Java单体架构项目_云霄外卖-特殊点

项目介绍&#xff1a; 定位&#xff1a; 专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件商品 分为&#xff1a; 管理端&#xff1a;外卖商家使用 用户端&#xff08;微信小程序&#xff09;&#xff1a;点餐用户使用。 功能架构&#xff1a; &#xff08…

ESP32实现UDP连接——micropython版本

代码&#xff1a; import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…

【想起就补】整理了一些SSH中常用的命令

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、常用命令类型2.1 远程登录相关2.2 文件操作命令2.3 权限和所有权操作命令2.4 文…

MT6989(天玑9300)芯片性能参数_MTK联发科5G处理器

MT6989是联发科Dimensity旗舰系列的成员&#xff0c;旨在为旗舰5G智能手机供应商提供最先进的技术和性能。MT6989也是联发科目前最具创新和强大的5G智能手机芯片&#xff0c;具有领先的功耗效率&#xff0c;无与伦比的计算架构&#xff0c;有史以来最快和最稳定的5G调制解调器&…

【操作系统期末速成】 EP04 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点七&#xff1a;进程通信2.2 考点八&#xff1a;线程的概念2.3 考点九&#xff1a;处理机调度的概念及原则2.4 考点十&#xff1a;调度方式与调度算法 一、前言&#x1f680;…

邀请函 | 极限科技全新搜索引擎 INFINI Pizza 亮相 2024 可信数据库发展大会!

过去一年&#xff0c;在全球 AI 浪潮和国家数据局成立的推动下&#xff0c;数据库产业变革不断、热闹非凡。2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;“2024 可信数据库发展大会” 将于 2024 年 7 月 16-17 日在北京悠唐皇冠…