【Linux系统编程】模拟实现一个最简版C语言标准IO库

文章目录

  • [1. MY_FILE结构体](#1. MY_FILE结构体)
  • [2. my_fopen函数](#2. my_fopen函数)
  • [3. my_fwrite函数](#3. my_fwrite函数)
  • [4. my_fflush函数](#4. my_fflush函数)
  • [5. my_fclose函数](#5. my_fclose函数)
  • [6. 测试](#6. 测试)
  • [7. 源码](#7. 源码)

准备工作:

创建三个文件

写一个makefile:

1. MY_FILE结构体

C语言标准库中,所有文件访问函数(fopen、fread、fwrite、fprintf、fclose)都必须通过 FILE* 流指针来操作的

那我们先来实现一下FILE结构体,我们就写成MY_FILE

然后我们重点来模拟实现这几个函数:

2. my_fopen函数

我们一起来实现一下:


那首先我们可以判断一下文件的打开模式,不同的模式,我们调用open时传的参数就不同:
我们这里只考虑几种常见的打开模式
如果打开失败,则返回一个空指针

如果打开成功,构造该文件对应的文件指针,并返回

3. my_fwrite函数

下面我们来实现my_fwrite函数:

回忆一下,调用fwrite这些函数的本质是什么,其实就是把数据从用户空间拷贝到FILE中的用户级缓冲区中!

拷贝过去就完了嘛
然后是不是要检查一下是否满足刷新条件啊,如果满足,则调用write系统调用刷新到内核缓冲区。不满足就暂存在缓冲区中,不刷新

4. my_fflush函数

fflush 是 C 标准库提供的函数,它的作用是将指定文件流(FILE*)的"用户态缓冲区"中暂存的数据,立即通过 write 系统调用"推"给内核(进入页缓存或终端缓冲区)。

5. my_fclose函数

fclose 在释放 FILE 结构体之前,内部会先强制执行一次刷新(相当于调用 fflush),把用户缓冲区里残余的数据全部通过 write 系统调用推给内核,然后再调用 close 关闭底层文件描述符

然后我们来测试一下:

6. 测试

运行测试一下:


所以,循环每次调用my_fwrite都会立即触发用户级缓冲区刷新到内核

然后:


我们把写入的字符串中的\n去掉。
那每次调用就不会触发刷新了
所以:

程序运行的过程中,我们查看log.txt就看不到有内容写入。
直到程序结束退出时统一刷新。

7. 源码

链接: link

相关推荐
跨境小彭8 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营
心之语歌8 小时前
Tkinter 画布基本梳理
运维·服务器·python
夜听莺儿鸣9 小时前
502-003_Linux 中断与异常(一):从Linux角度理解中断与异常
linux·中断与异常·linux中断
杨云龙UP10 小时前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
向成科技11 小时前
XC3576H工控主板|深度适配Ubuntu 26.04 LTS,释放边缘AI与工业开发新潜能
linux·人工智能·ubuntu·机器人·硬件·主板·边缘ai
铅笔小新z11 小时前
【C语言】操作符
c语言
Fcy64811 小时前
Linux下 进程间关系与守护进程
linux·运维·服务器·守护进程
g105655913912 小时前
公有云_云运维服务
java·运维·服务器
码农小韩12 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well061212 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器