Linux基础IO(open等文件相关系统调用)

发布时间:2026/8/30 16:32:07

Linux基础IO(open等文件相关系统调用)
一、文件是什么内容 属性文件 内容数据 属性元数据属性包括权限、大小、时间、属主、类型等由内核记录0 KB 的文件也占磁盘空间——内容为空但属性元数据必须存储平时用ls -l看到的大小只是内容大小不是文件真正占用的磁盘空间二、Linux 一切皆文件广义一切皆文件键盘、显示器、网卡、磁盘……都被抽象成文件统一用读/写接口操作向显示器写数据 显示从键盘读数据 输入狭义磁盘上普通的数据文件一切皆文件的核心价值用同一套 read/write 接口操作所有设备不用为每种设备发明新接口具体我会在下一篇文章详细介绍三、进程打开文件到底发生了什么关键认知程序编译成二进制 ≠ 打开文件代码里写了fopen(log.txt, w)编译出可执行程序但不运行→ 文件没被打开只有程序运行起来、执行到open/fopen那一行 → 文件才被打开所以打开文件是进程运行时的行为不是编译期的行为文件的两大分类内存级文件被进程打开或即将被打开的文件磁盘级文件未被打开、静静躺在磁盘上的文件本节课重点研究被打开的文件。四、操作系统是磁盘的真正管理者用户程序不能直接访问硬件磁盘你写代码操作文件真正读写磁盘的是操作系统用户程序必须通过系统调用接口操作系统提供的入口访问磁盘系统调用 vs 库函数层次例子说明系统调用open/read/write/close操作系统提供的接口直接进内核库函数fopen/fread/fwrite/fcloseC 标准库封装底层调用系统调用库函数底层封装了系统调用fopen封装openfclose封装close等各语言各自封装C/C/Python/PHP/Go 都有自己的一套文件接口但底层只有一套系统调用封装带来的好处代码可移植——换平台只需要换库的底层实现你的代码不用改五、内核如何管理被打开的文件问题系统同一时刻有大量被打开的文件谁在管内核负责管理所有被打开的文件内核为每个被打开的文件创建对应的struct_file 结构体大量结构体通过链表组织起来(先描述后组织进程 ↔ 文件的关系转化为进程结构体 ↔ 文件结构体这两种内核数据结构之间的关系六、库函数层面fopen / fwrite / fread / fclosefopen —— 打开文件FILE*fpfopen(log.txt,w);if(fpNULL){perror(fopen);exit(1);}返回FILE*文件指针指向内核维护的文件结构体的封装返回 NULL 说明打开失败必须检查返回值模式w写、r读、a追加等fwrite —— 写文件fwrite(buffer,sizeof(buffer),1,fp);fclose(fp);参数(数据指针, 基本单位大小 size, 基本单位个数 nmemb, FILE*)fread —— 读文件⚠️ 返回值大坑size_tnfread(buffer,sizeof(buffer)-1,1,fp);fread 返回值是成功读到的基本单位个数不是字节数返回值统计维度是nmemb基本单位个数不是字节真实读到的字节数 size × 返回个数老师写 mycat 时踩坑把n当字节数用结果只打印出第一个字符H正确姿势想让 buffer 存 127 个字符就把 buffer 定义成128预留\0位置charbuffer[128];while(1){size_tnfread(buffer,sizeof(buffer)-1,1,fp);// 一次最多读 127 字节if(n0){buffer[n]\0;// 手动补字符串结尾printf(%s,buffer);}if(feof(fp))break;// 读到文件结尾就停}feof —— 判断文件是否读到结尾feof(fp)返回非 0 表示已经读到文件结尾常配合 fread 循环使用读完判断 EOF跳出循环七、系统调用层面open为什么 open 是可变参数C 语言不支持函数重载但 open 要有两种用法 → 底层用可变参数va_list技术实现两种形式// 2 参数打开已存在的文件读文件时用intfdopen(path,O_RDONLY);// 3 参数创建新文件时指定权限 modeintfdopen(log.txt,O_CREAT|O_WRONLY|O_TRUNC,0666);2 参数版本文件已存在不需要新建 → 不需要 mode3 参数版本要新建文件带 O_CREAT→ 必须给权限 mode否则权限乱码flags位图传参O_RDONLY / O_WRONLY / O_RDWR / O_CREAT / O_APPEND / O_TRUNC都是宏本质是32 位 int 的不同 bit 标记每位代表一种属性用按位或|组合O_WRONLY | O_CREAT | O_TRUNCO_RDONLY默认全 0八进制 00所以单独使用不与其他位冲突mode 与 umask新建文件的权限陷阱// 期望权限 0666实际呢intfdopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);系统有默认umask 掩码会屏蔽掉 mode 中的某些权限位典型结果0666 → 实际 0664组的写权限被屏蔽想严格等于 mode先清 umaskumask(0);intfdopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);open 需要的头文件#includesys/types.h#includesys/stat.h#includefcntl.h八、系统调用层面readssize_tread(intfd,void*buf,size_tcount);fd文件描述符open 的返回值指定从哪个文件读buf读数据要放的缓冲区count缓冲区大小最多读多少字节返回值语义重点返回值含义 0实际读到的字节数 0读到文件结尾EOF 0读取失败注意read 返回值是字节数跟 fread 返回个数不同读文件的注意事项要读的文件必须已存在——读一个不存在的空文件毫无意义所以读文件不能用 O_CREAT只用O_RDONLY这也解释了open 为什么有 2 参数形式读文件不需要新建就不需要 modeintfdopen(log.txt,O_RDONLY);// 读2 参数就够了读上来的数据是原始字节流系统层面没有文本读和二进制读之分——读上来的都是二进制字节流要不要把它当文本解释由你自己决定想当字符就当字符想当什么就当什么九、文本/二进制写入是语言层概念系统层面只有一种写入二进制write接口的缓冲参数是void*——系统根本不关心你写的是什么类型所谓文本写入 / 二进制写入是语言/库层面的概念最终落到系统调用都是二进制显示器是字符设备写入的是字符向显示器写123456写的是字符串 “1” “2” “3” “4” “5” “6”6 个字符而不是二进制整数123456所以显示器这类设备叫字符设备十、代码演示mycat 的实现版本一库函数fopen fread#includestdio.h#includestring.h#includestdlib.hintmain(intargc,char*argv[]){if(argc!2){printf(Usage: %s filename\n,argv[0]);exit(1);}FILE*fpfopen(argv[1],r);if(fpNULL){perror(fopen);exit(2);}charbuffer[128];while(1){size_tnfread(buffer,sizeof(buffer)-1,1,fp);if(n0){buffer[n]\0;printf(%s,buffer);}if(feof(fp))break;}fclose(fp);return0;}版本二系统调用open read#includestdio.h#includestring.h#includestdlib.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.hintmain(intargc,char*argv[]){if(argc!2){printf(Usage: %s filename\n,argv[0]);exit(1);}intfdopen(argv[1],O_RDONLY);// 读2 参数不新建if(fd0){perror(open);exit(2);}charbuffer[128];ssize_tn;while((nread(fd,buffer,sizeof(buffer)))0){fwrite(buffer,1,n,stdout);// 写到标准输出}// n 0 → EOFn 0 → 出错close(fd);return0;}

相关新闻

Modbus RTU 与 Modbus TCP:它们有什么区别?

Modbus RTU 与 Modbus TCP:它们有什么区别?

2026/8/30 16:32:07

目录 Modbus RTU Modbus TCP 物理上的区别是什么 Modbus 能否成为一种简单且低成本的解决方案 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 Modbus RTU 和 Modbus TCP 都是工业自动化中常用的通信协议。然而&#xff0c…

十年车机性能优化经验总结系列(五):车机性能优化八维清单

十年车机性能优化经验总结系列(五):车机性能优化八维清单

2026/8/30 16:22:06

《十年车机性能优化》系列前四篇都在聊系统整体维度的打法,这篇切到 App 维度——聊聊一个车机应用自己在代码层能折腾点什么。 做车机这么多年,性能这摊事我来回踩过不少坑。这份清单是我站在龙鹰一号 / 8155 / 8295 这类低内存平台的视角,把…

智能手机传感器人体活动识别实战 从 Kaggle 多分类赛题到业务落地

智能手机传感器人体活动识别实战 从 Kaggle 多分类赛题到业务落地

2026/8/30 16:22:06

这道 Kaggle 赛题聚焦智能手机传感器人体活动识别,任务目标是依据加速度计与陀螺仪提取后的结构化特征,判断样本属于步行、上下楼、坐姿、站立还是躺卧。表面是标准多分类,实质更接近一类典型的传感器数据建模问题。 文章内容围绕赛题理解、…

srtp.rar实战:libsrtp编译与音视频SRTP加密集成排坑指南

srtp.rar实战:libsrtp编译与音视频SRTP加密集成排坑指南

2026/8/30 17:32:09

简介:实时音视频通信中,数据加密是保障内容安全的关键环节。SRTP(安全实时传输协议)在RTP基础上提供机密性、完整性与抗重放保护,广泛用于WebRTC、监控流加密、直播连麦等场景。libsrtp作为成熟的开源实现,…

Bending Spoons 收购 Airtable:用户应对策略与迁移评估指南

Bending Spoons 收购 Airtable:用户应对策略与迁移评估指南

2026/8/30 17:32:09

Bending Spoons 收购 Airtable,交易金额约 22 亿美元。这件事如果只当普通科技新闻扫一眼,很容易滑过去。但对正在用 Airtable 管理项目、客户、库存,甚至把自动化流程跑在它上面的团队来说,这其实是一条需要停下来做一次“系统体…

AI Agent从Demo到独立服务:任务调度、状态持久化与可观测性改造

AI Agent从Demo到独立服务:任务调度、状态持久化与可观测性改造

2026/8/30 17:32:09

Manus 这类 AI 智能体产品成为热点后,最常见的讨论是它的执行能力和商业前景。当“独立运营”这类消息出现时,技术团队的第一反应往往是另一个问题:一个能在演示视频里跑通的 Agent,距离一个能独立接受真实用户流量、持续迭代、出…

运行时行为差异对比:用RealDiff守护PR语义一致的工程实践

运行时行为差异对比:用RealDiff守护PR语义一致的工程实践

2026/8/30 17:32:09

做 Code Review 的时候,最怕遇到的问题往往不是代码格式,也不是变量命名,而是“代码看起来没变,行为却悄悄变了”。尤其在一个动辄改动十几个文件、横跨多个模块的 Pull Request 里,评审者很难只凭肉眼判断一次重构是否…

AI辅助基金申请书写作:从提效到防思路窄化的工程化实践

AI辅助基金申请书写作:从提效到防思路窄化的工程化实践

2026/8/30 17:32:09

基金申请书大概是科研写作里最“结果导向”的文体之一。同一个研究想法,表述方式不同,评审感受可能完全不同。所以当生成式 AI 进入科研工作流之后,很多人第一反应就是:能不能让 AI 帮我写基金申请书? 最近围绕“AI-a…

C盘满了怎么清理?磁盘空间分析与系统清理完整指南

C盘满了怎么清理?磁盘空间分析与系统清理完整指南

2026/8/30 17:22:09

C盘满了怎么清理,是 Windows 用户遇到频率最高的空间问题之一。不少人一看到“C盘红了”,第一反应是打开各种清理软件一键扫描,结果要么清不出多少空间,要么误删了系统文件导致软件无法运行。真正稳妥的做法是先搞清楚空间被谁占用…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…