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

news2025/1/13 15:59:21

除了虚拟化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.coloradmin.cn/o/1281564.html

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

相关文章

DBS note7 (end):DB Design

目录 一、前言 二、引言 三、Entity-Relationship Models(实体-关系模型) 1、关系约束 三、函数依赖和正则化 1、BCNF分解 2、无损分解 3、依赖关系保留分解 一、前言 略读过一遍CS186,对于CS186来说,绝对不止这 7 篇笔记…

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

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

算法通关村第十六关-白银挑战滑动窗口经典题目

大家好我是苏麟 , 今天带来滑动窗口经典的一些题目 . 我们继续来研究一些热门的、高频的滑动窗口问题 大纲 最长子串专题无重复字符的最长子串 长度最小的子数组盛最多水的容器 最长子串专题 无重复字符的最长子串 描述 : 给定一个字符串 s ,请你找出其中不含有重…

React如何像Vue一样将css和js写在同一文件

如果想在React中想要像Vue一样把css和js写到一个文件中,可以使用CSS-in-JS。 使用CSS-in-JS 下载 npm i styled-components使用 就像写scss一样,不过需要声明元素的类型 基本语法及展示如下, import styled from "styled-component…

React使报错不再白屏

如果代码中出现问题导致报错&#xff0c;通常会使页面报错&#xff0c;导致白屏 function Head() {// 此时模拟报错导致的白屏return <div>Head --- {content}</div> } export default () > {return (<><div>下面是标题</div><Head />…

Swing程序设计(7)JPane面板,滑动面板

文章目录 前言一、JPane面板&#xff0c;滑动面板是什么&#xff1f;二、实操展示 1.JPane面板2.JScrollPane面板总结 前言 该篇博客介绍Java的Swing程序中JPane面板以及&#xff0c;滑动面板的使用。面板的使用&#xff0c;各个组件在不同的面板上被不同地摆放&#xff0c;让插…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

Github无法打开

文章目录 一、问题二、解决2.1、科学上网&#xff08;使用中&#xff09;2.2、使用代理&#xff08;不稳定&#xff09;2.3、修改hosts&#xff08;得更新&#xff09;2.3.1、找到hosts文件2.3.2、复制hosts文件2.3.3、添加记录2.3.4、替换原来的hosts文件2.3.5、成功访问Githu…

W2311294-万宾科技可燃气体监测仪怎么进行数据监测

万宾科技可燃气体监测仪怎么进行数据监测 燃气是现代城市之中重要的能源&#xff0c;它已经渗透到城市生活的方方面面&#xff0c;对燃气管网的管理也在考验着政府人员的工作能力。燃气管网的安全运行和城市的安全和人民的生活直接挂钩。为了及时掌握燃气管网的运行状态&#x…

2023年GopherChina大会-核心PPT资料下载

一、峰会简介 自 Go 语言诞生以来&#xff0c;中国便是其应用最早和最广的国家之一&#xff0c;根据 Jetbrains 在 2021 年初做的调查报告&#xff0c;总体来说目前大概有 110 万专业的开发者 选择 Go 作为其主要开发语言。就其全球分布而言, 居住在亚洲的开发者最多&#xff…

了解大模型 RAG (Retrieval-Augmented Generation):大模型外挂知识库 (检索增强技术)

本心、输入输出、结果 文章目录 了解大模型 RAG &#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;大模型外挂知识库 &#xff08;检索增强技术&#xff09;前言什么是检索增强技术 RAG &#xff08;Retrieval-Augmented Generation&#xff09;检索增强技术…

RocketMQ领域模型详解

1、主题&#xff08;Topic&#xff09; 1.1、定义​ 主题是 Apache RocketMQ 中消息传输和存储的顶层容器&#xff0c;用于标识同一类业务逻辑的消息。 主题的作用主要如下&#xff1a; 定义数据的分类隔离&#xff1a; 在 Apache RocketMQ 的方案设计中&#xff0c;建议将不同…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…

python爬虫AES魔改案例:某音乐素材下载网

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cuYWlnZWkuY29tL3NvdW5kL2NsYXNzLw’) 拿到网址&#xff0c;F12打开调…

类 —— 多态、抽象类

多态 通常说的多态&#xff0c;是指发生在类之间的多态。即相同的代码&#xff0c;实现不同的功能。 函数重载 —— 静态多态/编译时多态。 类之间的多态 —— 动态多态/运行时多态。 前提 继承、虚函数、函数重写。 函数重写&#xff08;override&#xff09; 在子类中重…

正则表达式从放弃到入门(2):grep命令详解

正则表达式从放弃到入门&#xff08;2&#xff09;&#xff1a;grep命令详解 总结 本博文转载自 这是一篇”正则表达式”扫盲贴&#xff0c;如果你还不理解什么是正则表达式&#xff0c;看这篇文章就对了。 如果你是一个新手&#xff0c;请从头阅读这篇文章&#xff0c;如果你…

设计一门编程语言:你认为最重要的一定要有的特性会是哪些?

当我们站在软件工程师的角度来考虑设计一门编程语言时&#xff0c;我们需要关注那些能够提升代码质量、开发效率和程序可维护性的特性。 以下是我认为最重要的几个特性&#xff1a; 1、简洁而明确的语法&#xff1a;语法是程序员与编程语言交互的基础。简洁明了的语法可以降低…

Pandas实战:电商平台用户分析

数据分析 1.行为概况 首先&#xff0c;我们要对用户的行为类型有一定的理解&#xff0c;了解每个行为所代表的含义。 浏览&#xff1a;作为用户与商品接触的第一个行为&#xff0c;它的数量级与其他行为类型相比而言是非常庞大的&#xff0c;因为&#xff1a; 用户购买之前需…

JavaSE基础50题:7. 写一个方法返回参数二进制中1的个数(3种方法!)

文章目录 概述方法1方法2方法3 概述 返回参数中二进制中1的个数。 如&#xff1a; 15(十进制) —— 0000 1111(二进制) —— 4个1 ①我们把二进制的数字的每一位都&1&#xff0c;其中&#xff1a;1&11 、0&10 ②用无符号右移&#xff08;>>>&#xff09;来…

第一百八十八回 分享三个使用TextField的细节

文章目录 1. 概念介绍2. 使用方法2.1 修改组件的填充颜色2.2 修改组件的高度2.3 给组件添加圆角3. 示例代码4. 内容总结我们在上一章回中介绍了"DropdownButton组件"相关的内容,本章回中将介绍**TextField组件的细节.**闲话休提,让我们一起Talk Flutter吧。 1. 概念…