计算机导论——第39章 文件和目录

除了虚拟化CPU和内存,另外一个是持久存储,永久存储信息。持久存储设备与内存不同,内存在断电时内容会丢失,而持久存储设备会保持这些数据不变。

1. 文件和目录

文件就是一个线性字节数组,每个字节都可以读取或者写入。每个文件都有某种低级名称,通常是某种数字,由于历史原因,文件的低级名称通常称为inode号,即inode number。

文件系统的责任仅仅是将这些数据永久存储在磁盘上,并确保你再次请求数据时,得到你原来放在那里的内容,但是要实现这个并不简单。

目录就像一个文件一样,也有一个低级名字,即inode号,但是它的内容非常具体:它包含一个对的列表。

目录层次结构从根目录开始,并使用某种分隔符来命名后续子目录,直到命名所需的文件或目录。

文件名通常包含两部分:一部分是任意名称,一部分是指示文件类型的。但是这通常只是一个惯例

2. 文件系统接口

包含创建、访问和删除文件的基础

3. 创建文件

创建文件可以通过open系统调用完成,通过调用open() 并传入O_CREAT标志,程序可以创建一个新文件,如下:

int fd = open("foo", O_CREAT | O_WRONLY | O_TRUNC);

O_CREAT:创建文件

O_WRONLY:只能写入

O_TRUNC: 如果该文件已经存在,首先将其截断为零字节大小,删除现有内容

open的一个重要方面是它的返回值:文件描述符,它是一个整数,每个进程是私有的,文件描述符可以理解成一种权限,即一个不透明的句柄,它也可以让你执行某些操作;文件描述符也可以看作指向文件类型对象的指针。

4. 读写文件

跟踪程序系统调用的工具

  • Linux上的strace
  • MacOS上的dtruss或truss

每个正在运行的进程已经打开了三个文件:

  • 标准输入
  • 标准输出
  • 标准错误

系统调用read的原型为:

ssize_t read(int fd, void *buf, size_t count);
  • 第一个参数fd是文件描述符,告诉系统读取哪个文件
  • 第二个参数buf指向一个用于放置read()结果的缓冲区
  • 第三个参数是缓冲区大小
  • read的返回值是它读取的字节数

系统调用write原型

ssize_t write(int fd, const void *buf, size_t count);

5. 读取和写入,但不按顺序

如果你在文本文件上构建了索引并利用它来查找特定单词,最终可能从文件中的某些随机偏移中读取数据,为此,我们可以使用lseek系统调用

off_t lseek(int fildes, off_t offset, int whence);
  • whence=SEEK_SET时,offset为偏移字节数
  • whence=SEEK_CUR时,offset为当前位置加上字节数
  • whence=SEEK_END时,offset为整个文件大小加上字节数

lseek()调用只是在OS内存中更改一个变量该变量跟踪特定进程的下一个读取或者写入开始的偏移量。

6. 用fsync()立即写入

当程序调用write时,它只是告诉文件系统:请在将来的某个时刻,将此数据写入持久存储,由于性能原因,文件系统会将这些写入在内存缓冲一段时间后将写入实际发送到存储设备。只有在极少数情况下数据会丢失,比如写入磁盘之前机器崩溃。

但是在某些场景要求会更高,为了支持这些类型的应用程序,大多数文件系统都提供了一些额外的控制API,在UNIX中,提供给应用程序的接口称为fsync(int fd)。当进程针对特定文件描述符调用fsync()时,文件系统通过强制将所有脏数据写入磁盘来响应,一旦所有这些写入完成,fsync例程就会返回。

7. 文件重命名

系统调用rename

rename(char *old, char *new);

old: 文件原来名称

new: 新名称

rename提供了一个保证:它通常是一个原子调用,无论系统是否崩溃

8.获取文件信息

文件系统存储了每个文件大量的信息,这些数据通常称为文件元数据,要查看特定文件的元数据,我们可以使用stat或者fstat系统调用。

每个文件系统通常将这种类型的信息保存在一个名为inode的结构中。

9. 删除文件

删除文件相关的系统调用是unlink(),成功时返回零

10. 创建目录

你永远不能直接写入目录,因为目录的格式被视为文件系统元数据,所以你只能简介更新目录,例如,通过在其中创建文件、目录或其他对象类型。

创建目录的系统调用是mkdir()

目录创建时,虽然看起来是空的,但是它至少有两个条目:一个引用自身的条目,一个引用其父目录的条目。

11. 读取目录

相关的系统调用有opendir(), readdir()和closedir()

12. 删除目录

相关系统调用是rmdir,但注意该系统调用要求被删除之前目录是空的,否则调用会失败。

13. 硬连接

系统调用link()有两个参数:一个旧路径和一个新路径。当你将一个新的文件名链接到一个旧的文件名时,实际上创建了另一种引用同一个文件的方法。

你可以看到实际上已完成的链接,只是对inode号创建了新的引用。

创建文件时实际上做了两件事:

  • 创建一个结构,它将跟踪几何所有关于文件的信息,包括其大小、文件块在磁盘上的位置等
  • 将人类可读的名称链接到该文件,并将该链接放入目录中

调用unlink会删除人类可读的名称和给定inode号之间的链接,并减少引用计数,只有当引用计数达到零时,文件系统才会释放inode和相关数据块,从而真正删除该文件。

14. 符号链接

还有一种非常有用的链接类型,称为符号链接,有时称为软链接,事实表明,硬连接有点局限,你不能创建目录的硬连接。你不能硬连接到其他磁盘分区中的文件,所以人们又创建了软链接。

符号链接和硬链接实际上完全不同:第一个区别是符号链接本身是一个不同类型的文件;(除了文件和目录外的第三种类型);由创建符号链接的方式,由可能造成所谓的悬空引用(符号链接和硬链接完全不同,删除名为file的原始文件会导致符号链接指向不再存在的路径名)

15. 创建并挂载文件系统

创建文件系统的工具mkfs

挂载文件系统使用mount程序,它使用同名系统调用:以现有目录作为目标挂载点,本质上是将新的文件系统粘贴到目录树的这个点上。

mount的好处是:它将所有文件系统一到一棵树上,而不是有用多个独立的文件系统,这样让命名更加统一。

17. 小结

UNIX系统中文件系统接口看似非常基本,但是要想掌握它,还是需要不断的练习。

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

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

相关文章

Bean的加载方式

Bean的加载方式 文章目录 Bean的加载方式bean的xml方式声明bean的加载方式二&#xff1a;XML注解当时声明beanbean的加载方式三&#xff1a;注解方式声明配置类bean加载方式扩展——FactoryBean bean的xml方式声明 <?xml version"1.0" encoding"UTF-8"…

图论|并查集理论基础 1971. 寻找图中是否存在路径

什么是并查集 并查集是一种数据结构&#xff0c;用于处理一些不交集的合并及查询问题。它支持两种操作&#xff1a; 查找&#xff08;Find&#xff09;&#xff1a;确定某个元素属于哪个子集。它可以用来判断两个元素是否属于同一个子集。 合并&#xff08;Union&#xff09;&…

windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序

注意 千万不要去下载什么驱动精灵&#xff0c;太垃圾不好用还一堆附带的软件。按以下步骤进行解决&#xff1a; 解决方法 可能是显卡驱动的问题&#xff0c;我的笔记本按照如下步骤重启一下驱动后解决了&#xff0c;步骤如下: 右键点击桌面的开始菜单&#xff0c;选择”设备…

javaee实验:MVC 框架技术应用——URL 映射及方法参数的使用

目录 urlmvc框架mvc框架的设计mvc流程 实验目的实验内容实验过程创建项目创建项目结构编写代码简单测试一下 url 和 Hypertext 以及 HTTP 一样&#xff0c;URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制 URL 代表着是统一资源定位符&#xff…

智能优化算法应用:基于JAYA算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于JAYA算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于JAYA算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.JAYA算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

循环神经网络RNN及其变体LSTM、GRU

1. 背景 RNN(Recurrent Neural Networks) CNN利用输入中的空间几何结构信息&#xff1b;RNN利用输入数据的序列化特性。 2. SimpleRNN单元 传统多层感知机网络假设所有的输入数据之间相互独立&#xff0c;但这对于序列化数据是不成立的。RNN单元用隐藏状态或记忆引入这种依赖…

六、三台主机免密登录和时钟同步

目录 1、免密登录 1.1 为什么要免密登录 1.2 免密 SSH 登录的原理

TeXworks 初次使用 debug方法

下载Texlive&#xff0c;打开TeXworks editor 编译排版&#xff0c;可能会报很多错&#xff1a; 1. ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or (fontspec) LuaTeX. (fontspec) (fontspec) …

C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

目录 一、成员访问 1、[ ]&at 2、front( )&back( ) 二、插入元素 三、删除元素 四、替换元素 五、查找元素 1、查找第一次出现位置 2 、在指定范围内查找 六、交换字符串 七、c_str 八、rfind&substr 一、成员访问 1、[ ]&at 虽然二者功能一样&…

数据结构奇妙旅程之顺序表和链表

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

C++-内联函数

目录 一.什么是内联函数 1.内联函数的概念 2.内联函数的定义 二.C中引入内联函数的原因 三.什么样的函数适合被声明为内联呢&#xff1f; 四.面试题 一.什么是内联函数 1.内联函数的概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开…

springboot 2.4.4集成 hikari连接池多数据源实例

文章目录 前言一、配置步骤1.1 pom配置1.2 application.properties配置1.3 DataSourceContextHolder类1.4 DynamicDataSource1.5 DataSourceconfig类配置1.6 配置TargetDataSource注解1.7 切面方法1.8 dao的写法 二、测试验证2.1 启动springboot项目2.2 检查数据库连接2.3 debu…

python——进程常用功能

Python的multiprocessing模块提供了强大的并行处理能力&#xff0c;以下是几个功能的详细解释&#xff1a; join(): 在multiprocessing中&#xff0c;join方法用于阻塞主进程直到指定的进程终止。这对于确保所有子进程在程序结束前完成其工作是很有用的。deamon(): 在multipro…

基于51单片机的十字路口交通灯_5s黄灯倒计时闪烁

基于51单片机十字路口交通灯_5s黄灯闪烁 &#xff08;程序仿真仿真视频&#xff09; 仿真&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;J006 功能要求 交通灯运行状态&#xff1a; &#xff08;1&…

硬件基础:二极管

基本定义 二极管的内部其实就是一个PN结。 把PN结封装起来&#xff0c;两边加上两个电极&#xff0c;就组成了半导体二极管。简称二极管&#xff08;Diode&#xff09; 二极管和PN结一样&#xff0c;具有单向导通性&#xff1a; 外观和正负极 常见芯片封装如下&#xff1a; 一般…

java 工具类: CompareUtils(比较对象字段值变化)

一、前言 我们在工作中&#xff0c;可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面&#xff0c;记录每次修改的变化。我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化, 这样我们就可以知道数据做了哪些改变. 二、条件限制 在写这个通用…

ImportError: cannot import name ‘metadata‘ from ‘importlib‘

yolov8 编译问题 ImportError: cannot import name ‘metadata’ from ‘importlib’ 将 from importlib import metadata 更改为 import importlib_metadata as metadata

【WinForm.NET开发】创建 Windows 窗体应用

本文内容 创建项目创建应用程序运行应用程序 本文演示创建一个具有基于 Windows 的用户界面 (UI) 的简单 C# 应用程序。 1、创建项目 首先&#xff0c;创建 C# 应用程序项目。 项目类型随附了所需的全部模板文件&#xff0c;无需添加任何内容。 打开 Visual Studio。在“开…

vs 安装 qt qt扩展

1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2

【设计模式-4.1】行为型——观察者模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;观察者模式&#xff1b; 商家与顾客 观察者模式属于行为型设计模式&#xff0c;关注对象的行为。以商家与顾客为例&#xff0c;商家有商品&#xff0c;顾客来购买商品&#xff0c;如果商家商品卖完了&#…