计算机导论——第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.mfbz.cn/a/214253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试题:说说 Cookie、Session、Token、JWT?

文章目录 什么是认证(Authentication)什么是授权(Authorization)什么是凭证(Credentials)什么是 Cookiecookie 重要的属性 什么是 Sessionsession 认证流程 Cookie 和 Session 的区别什么是 Token&#xff…

Python面向对象④:继承【侯小啾python领航班系列(二十二)】

Python面向对象④:继承【侯小啾python领航班系列(二十二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

loguru的简单使用

详细使用:Table of contents — loguru documentation 【1】日志的级别 日志级别默认分为6种 1、NOTSET (0)2、DEBUG (1)3、INFO (2)4、WARNING (3)5、ERROR (4)6、CRITICAL (5) logging 执行时输出大于等于设置的日志级别的日志信息,如设置日…

leetCode 51.皇后 + 回溯算法 + 图解 + 笔记

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包…

nodejs介绍

nodejs官网支持的各种库api https://nodejs.org/docs/latest-v21.x/api/http.html nodejs包括vp8引擎和内置的基本库如fs,path,http,querystring等,也可以用npm按转第三方库 npm是nodejs环境的包管理工具,可以为这个环境安装卸载各种包。 npm install pk…

类和对象——(4)特殊的成员函数

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 一个人不是在逆境中成长,就…

4/150:寻找两个正序数组的中位数⭐ 5/150最长回文子串

题目:4/150寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 题解1:暴力 暴力思路简介&#x…

JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)

基于JavaSpringbootVue的体育馆预约系统(源代码数据库12000字论文)113 一、系统介绍 本项目前后端分离,本系统分为管理员、用户两种角色 用户角色包含以下功能: 注册、登录、场地(查看/预订/收藏/退订)、在线论坛、公告查看、我的预订管理、我的收藏…

综合实验—增强分析和配置中小型企业网络的综合能力

实验拓扑、实验编址如下图表所示,本实验模拟了一个企业网络场景, 其中R1和R2为公司总部路由器,交换机S1、S2、S3组成了总部的园区网,R3、R4、 R5为公司分部的路由器。 总部园区网中3台交换机都运行MSTP协议,用来防止二…

统计3个点的6种结构在三角形内的占比

平面内的3个点只可能有6种结构 1 - - - - 4 - - - - - - - - - - - - - - - - - - - - - - - 1 - - - 1 - - 1 1 - 1 1 - 2 - - - - 5 - - - - - - - - - - - - - - - 1 - - - 1 - - - 1 - - 1 - …

回归分析:预测和建模

回归分析:预测和建模 写在开头1. 回归分析的基本概念2. 回归分析的方法2.1 简单线性回归2.1.1 数学知识2.1.2 应用举例2.2 多元线性回归2.2.1 数学公式和应用2.2.1 应用场景举例2.3 多项式回归2.3.1 数学公式和应用2.3.2 应用场景举例2.4 逻辑回归2.4.1 数学公式和应用2.4.2 应…

Shell循环:whileuntil

一、特点:循环次数[一定]是固定的 二、while语句结构 while 条件测试 do 循环体 done 当条件测试成立(条件测试为真),执行循环体 演示: 需求:每秒显示一个数字,一…

MySQL进阶_EXPLAIN重点字段解析

文章目录 第一节.准备1.1 版本信息1.2 准备 第二节.type2.1 system2.2 const2.3 eq_ref2.4 ref2.5 ref_or_null2.6 index_merge2.7 unique_subquery2.8 range2.9 index2.10 all 第三节. Extra3.1 No tables used3.2 No tables used3.3 Using where3.4 No matching min/max row3…

leetcode - 矩阵区域和

1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c …

Day48力扣打卡

打卡记录 最大化城市的最小电量&#xff08;二分前缀和差分数组贪心&#xff09; 链接 class Solution:def maxPower(self, stations: List[int], r: int, k: int) -> int:n len(stations)sum list(accumulate(stations, initial0))for i in range(n):stations[i] sum[…

速达软件全系产品存在任意文件上传漏洞 附POC

@[toc] 速达软件全系产品存在任意文件上传漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。…

Fiddler抓包工具之fiddler设置手机端抓包

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; &#xff0c;点击online&#xff0c;最后一行就是ip地址 2、路径&#xff1a;Tools》O…

栈和队列的OJ题--13.用队列实现栈

13. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; /*解题思路&#xff1a; 此题可以用两个队列去实现一个栈&#xff0c;每次始终保持一个队列为空&#xff0c; 入栈操作相当于给非空队列进行入队操作 出栈操作相当于非空队列的队尾元素出队&…

RT-Thread ADC_DMA

看到这里&#xff0c;相信大家已经尝试过网上各类ADC_DMA传输的文章&#xff0c;且大多都并不能实现&#xff0c;因为在RT-Thread中并没有找到关于ADC的DMA接口&#xff0c;在官方例程中有关DMA的传输也只有一个串口接收的介绍&#xff0c;找遍全网怕也没能找到真正有用的消息。…

0基础学java-day13

一、包装类 1. 包装类的分类 1) 针对八种基本数据类型相应的引用类型【对象】—包装类 2) 有了类的特点&#xff0c;就可以调用类中的方法。 3) 如图: 2 包装类和基本数据的转换 3 案例演示 Integer01.java package com.hspedu.wrapper;/*** author 林然* version 1.0*/ p…
最新文章