【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

相关推荐
FW-Linker1 小时前
什么是5G直播背包?广电记者外场推流入门指南
服务器·网络·5g
aningx2 小时前
使用自定义bash脚本预防oom卡死 v2
linux
JoyCong19983 小时前
知识科普:ToDesk鸿蒙版高级功能免费开放使用了!
运维·服务器·华为·智能手机·harmonyos·远程工作
yu_zhidun3 小时前
企业电脑数据防泄密软件选型:内网终端 DLP 落地实战指南
服务器·网络·电脑
cjp5603 小时前
011. UG二次开发,UG管道通讯服务器与wpf客户端通讯
linux·运维·服务器
智闲电子设计3 小时前
RS485 总线实战:终端电阻、差分信号、半双工方向控制,工程里最容易翻车的几处
c语言·stm32·单片机·嵌入式硬件
上官唐云3 小时前
2024届本科 | C++ Linux服务端开发求职:从嵌入式到底层服务端的技术之路(附开源项目+简历)
linux·c++·开源·求职招聘
Zucker n3 小时前
Ubuntu24.04结合ollama本地使用Hermes
linux·ubuntu
邪修king4 小时前
Linux系统篇(二十三) 基础 IO:从“文件”到“文件描述符”,彻底理解重定向
android·java·linux