Linux -- 基础IO
1.文件1.狭义理解⽂件在磁盘⾥磁盘是永久性存储介质因此⽂件在磁盘上的存储是永久性的磁盘是外设即是输出设备也是输⼊设备磁盘上的⽂件 本质是对⽂件的所有操作都是对外设的输⼊和输出 简称 IO2.广义理解Linux 下⼀切皆⽂件3.⽂件操作的归类认知对于 0KB 的空⽂件是占⽤磁盘空间的⽂件是⽂件属性元数据和⽂件内容的集合⽂件 属性元数据 内容所有的⽂件操作本质是⽂件内容操作和⽂件属性操作4.系统角度理解对⽂件的操作本质是进程对⽂件的操作磁盘的管理者是操作系统⽂件的读写本质不是通过 C 语⾔ / C 的库函数来操作的这些库函数只是为⽤⼾提供⽅便⽽是通过⽂件相关的系统调⽤接⼝来实现的2.系统文件I/O2.1 接口介绍open()的作用打开一个文件并返回一个文件描述符int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); pathname: 要打开或创建的⽬标⽂件 flags: 打开⽂件时可以传⼊多个参数选项⽤下⾯的⼀个或者多个常量进⾏“或”运算构成 flags。 参数: O_RDONLY: 只读打开 O_WRONLY: 只写打开 O_RDWR : 读写打开 这三个常量必须指定⼀个且只能指定⼀个 O_CREAT : 若⽂件不存在则创建它。需要使⽤mode选项来指明新⽂件的访问权限 O_APPEND: 追加写 mode 指的是 创建新文件时给这个文件设置的初始权限。 返回值 成功新打开的⽂件描述符 失败-12.2 文件描述符 fdLinux进程默认情况下会有3个缺省打开的⽂件描述符分别是标准输⼊0 标准输出1 标准错误2.0,1,2对应的物理设备⼀般是键盘显⽰器显⽰器⽽现在知道⽂件描述符就是从0开始的⼩整数。当我们打开⽂件时操作系统在内存中要创建相应的数据结构来描述⽬标⽂件。于是就有了file结构体。表⽰⼀个已经打开的⽂件对象。⽽进程执⾏open系统调⽤所以必须让进程和⽂件关联起来。每个进程都有⼀个指针*files, 指向⼀张表files_struct,该表最重要的部分就是包含⼀个指针数组每个元素都是⼀个指向打开⽂件的指针所以本质上⽂件描述符就是该数组的下标。所以只要拿着⽂件描述符就可以找到对应的⽂件。⽂件描述符的分配规则在files_struct数组当中找到当前没有被使⽤的最⼩的⼀个下标作为新的⽂件描述符。2.3 重定向改变输入输出的方向叫做重定向常⻅的重定向有: , , 重定向的本质2.4 dup2dup2()可以理解成把一个文件描述符“复制到指定的编号”上。int dup2(int oldfd, int newfd);让newfd和oldfd指向同一个打开的文件。3.理解 Linux下一切皆文件开发者仅需要使⽤⼀套API和开发⼯具即可调取Linux系统中绝⼤部分的 资源。举个简单的例⼦Linux中⼏乎所有读读⽂件读系统状态读PIPE的操作都可以⽤ read 函数来进⾏⼏乎所有更改更改⽂件更改系统参数写PIPE的操作都可以⽤ write 函 数来进⾏。上图中的外设每个设备都可以有⾃⼰的read、write但⼀定是对应着不同的操作⽅法但通过 struct file 下 file_operation 中的各种函数回调让我们开发者只⽤file便可调取Linux系 统中绝⼤部分的资源这便是“linux下⼀切皆⽂件”的核⼼理解。4.缓冲区4.1 什么是缓冲区缓冲区是内存空间的⼀部分。也就是说在内存空间中预留了⼀定的存储空间这些存储空间⽤来缓 冲输⼊或输出的数据这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输⼊设备还是输出设 备分为输⼊缓冲区和输出缓冲区。4.2 为什么要引⼊缓冲区机制读写⽂件时如果不会开辟对⽂件操作的缓冲区直接通过系统调⽤对磁盘进⾏操作(读、写等)那么 每次对⽂件进⾏⼀次读写操作时都需要使⽤读写系统调⽤来处理此操作即需要执⾏⼀次系统调 ⽤执⾏⼀次系统调⽤将涉及到CPU状态的切换即从⽤⼾空间切换到内核空间实现进程上下⽂的 切换这将损耗⼀定的CPU时间频繁的磁盘访问对程序的执⾏效率造成很⼤的影响。为了减少使⽤系统调⽤的次数提⾼效率我们就可以采⽤缓冲机制。⽐如我们从磁盘⾥取信息可 以在磁盘⽂件进⾏操作时可以⼀次从⽂件中读出⼤量的数据到缓冲区中以后对这部分的访问就不 需要再使⽤系统调⽤了等缓冲区的数据取完后再去磁盘中读取这样就可以减少磁盘的读写次数 再加上计算机对缓冲区的操作⼤ 快于对磁盘的操作故应⽤缓冲区可⼤ 提⾼计算机的运⾏速度。 ⼜⽐如我们使⽤打印机打印⽂档由于打印机的打印速度相对较慢我们先把⽂档输出到打印机相 应的缓冲区打印机再⾃⾏逐步打印这时我们的CPU可以处理别的事情。可以看出缓冲区就是⼀ 块内存区它⽤在输⼊输出设备和CPU之间⽤来缓存数据。它使得低速的输⼊输出设备和⾼速的 CPU能够协调⼯作避免低速的输⼊输出设备占⽤CPU解放出CPU使其能够⾼效率⼯作。4.3 缓冲类型标准I/O提供了3种类型的缓冲区•全缓冲区这种缓冲⽅式要求填满整个缓冲区后才进⾏I/O系统调⽤操作。对于磁盘⽂件的操作通 常使⽤全缓冲的⽅式访问。•⾏缓冲区在⾏缓冲情况下当在输⼊和输出中遇到换⾏符时标准I/O库函数将会执⾏系统调⽤ 操作。当所操作的流涉及⼀个终端时例如标准输⼊和标准输出使⽤⾏缓冲⽅式。因为标准 I/O库每⾏的缓冲区⻓度是固定的所以只要填满了缓冲区即使还没有遇到换⾏符也会执⾏ I/O系统调⽤操作默认⾏缓冲区的⼤⼩为1024。•⽆缓冲区⽆缓冲区是指标准I/O库不对字符进⾏缓存直接调⽤系统调⽤。标准出错流stderr通 常是不带缓冲区的这使得出错信息能够尽快地显⽰出来。除了上述列举的默认刷新⽅式下列特殊情况也会引发缓冲区的刷新1. 缓冲区满时 2. 执⾏flush语句 3. 进程结束

相关新闻

Apache IoTDB 入驻 Google Code Wiki:时序数据库核心技术解析与工程实践

Apache IoTDB 入驻 Google Code Wiki:时序数据库核心技术解析与工程实践

看到“Apache IoTDB 入驻 Google Code Wiki 技术知识库”这个标题,我第一反应是:这可不是一条简单的收录公告。对一个开源数据库项目来说,“被收录”意味着它的文档体系开始被第三方知识平台认可,也意味着更多开发者能通过检索直接…

2026/10/10 6:13:50 阅读更多 →
AnyPS5架构解析:跨平台串流与模拟的工程实践

AnyPS5架构解析:跨平台串流与模拟的工程实践

1. 从“AnyPS5”这个标题说起:它到底想解决什么问题第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个围绕“把某类资源、某类能力、某类体验搬到任意设备上”做文章的项目。为什么这么说?因为“Any”…

2026/10/10 6:12:50 阅读更多 →
eBPF与io_uring:Linux系统级监控与高性能IO实践

eBPF与io_uring:Linux系统级监控与高性能IO实践

抱歉,这个项目标题涉及恶意软件开发与攻击技术(Rootkit 本身是用于隐蔽入侵和非法控制系统的高危恶意程序),属于法律与社会公序良俗明确禁止的范畴。我不能提供任何关于 Rootkit 开发原理、实现步骤、隐蔽技巧或演进方向的讲解内容…

2026/10/10 6:12:50 阅读更多 →

最新新闻

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:51 阅读更多 →
SpringBoot2+Vue3校园生活信息平台:前后端分离实践与部署

SpringBoot2+Vue3校园生活信息平台:前后端分离实践与部署

1. 项目解析与整体思路1.1 校园生活信息平台到底解决什么问题大学校园的信息流通,说实话一直是个"说起来重要、做起来随意"的事情。今天社团要纳新,明天食堂有新品试吃,后天图书馆临时闭馆——这些信息要么贴在公告栏,要…

2026/10/10 16:00:50 阅读更多 →
gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master 排查与TaoToken辅助定位

gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master 排查与TaoToken辅助定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
为什么钉钉、飞书、企微都在做 CLI?用 TaoToken 统一 Key 跑通开源项目 CLI 的实战拆解

为什么钉钉、飞书、企微都在做 CLI?用 TaoToken 统一 Key 跑通开源项目 CLI 的实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
C语言贪吃蛇项目——第二部分绘制菜单和初始界面:用TaoToken统一Key调试控制台渲染

C语言贪吃蛇项目——第二部分绘制菜单和初始界面:用TaoToken统一Key调试控制台渲染

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
高通 IQ9075 大模型 Benchmark 全维度实测:从算力基准到场景落地,TaoToken 统一 Key 打通评测链路

高通 IQ9075 大模型 Benchmark 全维度实测:从算力基准到场景落地,TaoToken 统一 Key 打通评测链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:59:48 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →