01. C/系统调用文件操作

C/系统调用文件操作


02. 文件系统(ext2)结构

在这里插入图片描述

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个块的大小(有1MB,2MB或4MB)是由格式化的时候确定的,并且不可以更改。而上图中启动块引导快的大小是确定的。每个块组都有着相同的结构组成。

超级块和块组描述符表 会在多个块组中备份,以提高容错能力。其余结构(数据块位图、inode 位图、inode 表、数据块)是每个块组独立管理的。

文件访问:

  • 通过目录数据块找到文件名对应的inode
  • 从inode表中读取inode号,在文件混合索引内找到获取数据块指针
  • 根据指针访问文件内容

文件创建:

  • 在位示图找到为o的inode分配并写入inode表
  • 在文件数据块找到空闲块分配给它
  • 更新数据块,并添加文件名和inode的映射关系

文件删除:

  • 位示图和数据块位图置0,并在目录数据块删除此二元关系

2.1 文件物理结构

2.1.1 连续分配

文件存储在物理上连续的磁盘块上,通过始址和长度(磁盘所占块数)定位。

特点:

  • 顺序访问高效:磁头移动少,适合顺序读写(如视频流)。
  • 有外部碎片,扩展困难(文件动态增长与增删)

2.1.2 链接分配

文件分散存储在磁盘块上,每块包含指向下一块的指针(链式结构)。链接分配有隐式链接和显示链接(FAT)两种

隐式链接特点:

  • 无外部碎片,能动态扩展(增删)。
  • 指针占用块空间,访问第i块必须从表头遍历链表

文件分配表(FAT):集中存储块链接关系,避免块内指针开销,但需将FAT常驻内存以提高性能。

2.1.3 索引分配

为每个文件创建索引块,存储其所有数据块的地址。

特点:

  • 支持随机访问:直接通过索引定位任意块。
  • 无外部碎片:灵活分配空间。

2.2 超级块

存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

struct ext2_super_block {__le32  s_inodes_count;         /* 索引节点总数 */__le32  s_blocks_count;         /* 块总数 */__le32  s_r_blocks_count;       /* 保留的块数 */__le32  s_free_blocks_count;    /* 空闲块计数器 */__le32  s_free_inodes_count;    /* 空闲索引节点计数器 */__le32  s_first_data_block;     /* 第一个数据块的块号,总是为1 */...__le32  s_first_meta_bg;        /* 第一个元块组 */__u32   s_reserved[190];        /* 填充到块的末尾 */
};

2.3 块组描述符表

描述块组属性信息


2.4 位示图

块组中 Inode 的分配状态(已用/空闲)

struct ext2_inode {__le16  i_mode;         /* 文件类型和访问权限,查看S_ISREG()等函数 */__le16  i_uid;          /* 所有者 Uid 的低 16 位,拥有者id */// 文件长度,最高位没使用,最大表示2GB文件,大于2GB文件再使用i_dir_acl字段__le32  i_size;         /* 大小(字节) */__le32  i_atime;        /* 访问时间 */__le32  i_ctime;        /* 索引节点创建时间 */__le32  i_mtime;        /* 文件数据最后改变时间 */__le32  i_dtime;        /* 删除时间 */__le16  i_gid;          /* 组 ID 的低 16 位,用户组id */__le16  i_links_count;  /* 硬链接计数 */
...
};

在这里插入图片描述


2.5 文件描述符fd

fd是操作系统中用于标识和访问已打开文件或I/O资源的整数标识符。存放

  • 每个进程的 task_struct 包含一个 files_struct 结构,内部维护一个 fd 数组
  • file*fd_array[]中存放多个file*
  • 数组索引(下标)即为fd,数组内部元素指向内核中的file对象

file*fd_array[]中下标为012分别预留给stdinstdoutstderr,所以新分配的原则是选择未使用最小的开始分配。使用close()即可释放任意已分配的fd,进程结束未关闭的fd由内核自动回收。

在这里插入图片描述


2.6 重定向

在这里插入图片描述
在这里插入图片描述

fgets是语言层面的读取函数,其底层也是用了系统标准输入接口。其中写死了只能对0号文件描述符进行读取操作。而现在上边的代码将0号文件描述符给了新的文件。故该程序将读出log.txt文件中的内容。这里完成了输入重定向。

系统调用实现重定向:

int dup2(int oldfd, int newfd);

oldfd:要被复制已打开的fd

newfd:新的描述符编号

返回值:成功返回 newfd,失败返回 -1 并设置 errno
oldfd的值变为newfd旳值,效果等同于上面先将fd=1指向的stdout关闭,然后再将fd=1分配给新打开的文件。
dup2(fd,1)将原本向显示器输出的内容输出到fd指向的文件中。

在这里插入图片描述


2.7 inode

存储文件或目录的元数据(不包括文件名)

在这里插入图片描述

注:

  • 在Unix文件系统中,每个文件必须对应一个inode结点,而 inode结点的总数量是有上限的。如:仅用8KB作为inode区,假设每个inode大小为64B,则该文件系统最多只能存储8KB/64B=128个 inode结点,相应地,该系统最多只能支持128个文件。
  • 当一个进程通过open系统调用打开某个文件时,操作系统需要将该文件对应的 inode结点读入主存。

2.8 数据块

  • 作用:存储文件的实际内容或目录的结构信息。
  • 类型
    • 文件数据块:存储普通文件的实际内容(如文本、图片等)。
    • 目录数据块:存储该目录下的条目(文件名 + Inode 号)。
    • 符号链接数据块:若链接路径较短,直接存储在 Inode 中;较长时占用数据块。
    • 特殊文件:如设备文件(/dev/sda)的元数据存储在 Inode 中,无需数据块。

文件数据块:

当一个文件过大时,则需要多个块储存数据。

在这里插入图片描述

目录文件数据块:

存放的是目录下文件名和inode的二元映射关系。

在这里插入图片描述


2.9 缓冲区

缓冲区的存在,能够提高数据效率。一般c语言库函数写入文件采用的是全缓冲,而写入显示器是航缓存。

如果一块数据多次分批写入外存效率低开销大,但是一次性写入效率最高。

  • 全缓冲文件输出,效率高但实时性差,缓冲区满I/O
  • 行缓冲:**终端(C库)**输出,遇到 \n 或缓冲区满时刷新。
  • 无缓冲:如 stderr,立即输出。

缓冲区刷新:

  • 用户强制刷新
  • 进程退出

例如有语句char *str="helloworld",首先将该字符串存放在FILE结构体内的C缓冲区,满足条件后将数据刷新到内核缓冲区,在这个区域由OS维护和操作。

内核空间
用户空间
标准库函数
系统调用
缓冲区满/flush
立即进入
内核页缓存
磁盘控制器
标准库缓冲区
应用程序
用户直接缓冲区
物理磁盘

在这里插入图片描述

首先关闭文件描述符为1open分配的log.txt文件的fd为1,后面printffprintf会对新打开的文件(fd=1)执行新操作,改变了刷新机制。但是close(fd)使得文件描述符被关闭,C缓冲区内容无法向OS文件内核缓冲区刷新,故不会将数据刷新到log.txt内。


03. 软硬链接

二者区别:软链接会创建新的inode,而硬连接不会。

硬链接

  • 在目录条目中新增一个文件名,指向同一 inode。
  • inode 的 引用计数 会递增(可通过 stat 命令查看)

在这里插入图片描述

软链接

  • 创建一个新的 inode 和文件,文件内容为目标路径字符串。
  • 访问软链接时,内核会递归解析路径。

在这里插入图片描述


04. 动静态库

待写…

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

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

相关文章

算法中的数学:欧拉函数

1.相关定义 互质:a与b的最大公约数为1 欧拉函数:在1~n中,与n互质的数的个数就是欧拉函数的值 eg: n1时,欧拉函数的值为1,因为1和1是互质的 n2是,值为2,因为1和2都是互质的 积性函数&…

BaseDao指南

1. BaseDao类 import java.sql.*;/*** 通用的工具类 ,负责连接数据, 执行增删改查的通用方法*/ public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立数据库连接** return*/public Boolean getCon…

SpringBoot JAR 启动原理

文章目录 版本概述JAR 包结构MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 时序图参考 版本 Java 17SpringBoot 3.2.4 概述 JAR 启动原理可以简单理解为“java -jar的启动原理” SpringBo…

YOLO11解决方案之速度估算探索

概述 Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 YOLO速度估算结合物体检测和跟踪技术,使用YOLO11 模型检测每帧中的物体&#xf…

初识C++:模版

本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2. 显式实例化&#xff1a;在函数名后的<>中指定模…

人工智能100问☞第27问:神经网络与贝叶斯网络的关系?

神经网络与贝叶斯网络是两种互补的智能模型:神经网络通过多层非线性变换从数据中学习复杂模式,擅长大规模特征提取和预测,而贝叶斯网络基于概率推理建模变量间的条件依赖关系,擅长处理不确定性和因果推断。两者的融合(如贝叶斯神经网络)结合了深度学习的表征能力与概率建…

【node.js】入门基础

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的核心特点1.2 Node.js适用场景 2. 第一个Node.js程序2.1 创建并运行Hello World2.2 创建简单的HTTP服务器 3. Node.js核心概念3.1 模块系统3.1.1 创建和导出模块3.1.2 导入和使用模…

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%

百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日&#xff0c;百度飞桨团队正式发布了 PaddleOCR 3.0 版本&#xff0c;并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展&#xff0c;进一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL开发实战指南(AIDL版)

Android 14 Binderized HAL开发实战指南&#xff08;AIDL版&#xff09; 环境要求 Android 14源码编译环境AOSP android-14.0.0_r7分支Soong build系统Java 17 & NDK r25c 项目结构 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是欢乐。 时间是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能从容面对…

交安安全员:交通工程安全领域的关键角色

在交通工程这个庞大而复杂的领域中&#xff0c;交安安全员扮演着举足轻重的角色&#xff0c;他们是安全的捍卫者&#xff0c;是交通工程顺利推进的重要保障。​ 交安安全员&#xff0c;专门从事公路水运工程施工企业安全生产管理工作。他们的专业身份由交通运输部门颁发的交安…

实验-设计一个应用系统(计算机组成原理)

目录 一. 实验内容 二. 实验步骤 &#xff08;1&#xff09;七段数码管显示模块 &#xff08;2&#xff09;指令模块 &#xff08;3&#xff09;控制模块 &#xff08;4&#xff09;ALU模块 &#xff08;5&#xff09;CPU模块 三. 实现效果 四. 实验环境 五. 实验小结…

【博客系统】博客系统第四弹:令牌技术

令牌机制 为什么不能使用 Session 实现登录功能&#xff1f; 传统思路&#xff1a; 登录页面把用户名密码提交给服务器。服务器端验证用户名密码是否正确&#xff0c;并返回校验结果给前端。如果密码正确&#xff0c;则在服务器端创建 Session。通过 Cookie 把 sessionId 返回…

【瑞数3代】药监评审中心逆向分析 | 后缀MmEwMD参数

1.目标 目标网址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫话机器学习系列】274.基尼指数(Gini Index)

决策树中的基尼指数&#xff08;Gini Index&#xff09;详解 —— 从公式理解到实际应用 在构建决策树模型时&#xff0c;一个核心问题是&#xff1a;如何选择最优的特征来进行节点划分&#xff1f; 这就涉及到了“划分准则”的问题。常见的准则有信息增益、信息增益率以及本文…

R语言学习--Day07--T分布与T检验

昨天我们介绍了R中用于对数据进行分类的聚类分析的方法&#xff0c;接下来我们来看T分布。 T分布 T分布适用于帮我们估计整组数据&#xff08;较小的数据量&#xff0c;一般小于30&#xff09;的真实值在哪一个区间&#xff0c;具体是计算置信区间&#xff08;一般为95%&#…

数据结构与算法-线性表-双向链表(Double Linked List)

1 线性表 1.4 双向链表&#xff08;Double Linked List&#xff09; 双向链表的结点中有两个指针域&#xff0c;一个指向直接后继&#xff0c;另一个指向直接前驱&#xff0c;主要是为了解决前向查找的问题。 双向链表结构&#xff1a; 书籍和视频教程都只讲解了插入和删除的…

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例&#xff0c;并对其进行汉化和自定义配置。首先&#xff0c;通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着&#xff0c;通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…

C++23 新增扁平化关联容器详解

文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…

使用zap,对web应用/API接口 做安全检测

https://www.zaproxy.org/getting-started/ 检测方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 执行baseline测试 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 执行api测试 docker run -t ghcr.io/zaproxy/zaproxy…