【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

相关推荐
苏宸啊7 分钟前
Reactor反应堆模式
linux
javaDocker17 分钟前
1800 亿科技投入砸下去,多数机构平的只是服务器,不是能力
运维·服务器·人工智能·科技·研发效能·金融科技
服务器硬件项目经理33 分钟前
超节点修仙录 目 录
服务器·硬件工程·硬件
骇客野人1 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
_菜鸟果果1 小时前
高德地图 JS API 2.0 在国产 Linux/ARM 电脑上渲染失败 的排查与解决
linux·开发语言·javascript
GeW1 小时前
飞行汽车交付阿联酋,真正先“起飞”的是低空数据基座——红帽Linux与数据库高可用为什么成了低空运营的隐形跑道
linux
0+1111 小时前
Linux --DNS与ICMP
linux·运维·服务器
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言文件 — 完整知识点详解(14)
c语言·网络·学习
我命由我123452 小时前
5-1.Python 编码进阶 - 函数进阶(参数、返回值、递归、函数作为参数传递、lambda 匿名函数)
java·服务器·数据库·后端·python·java-ee·python3.11
bjxiaxueliang2 小时前
一文自建STUN:在Ubuntu上分步搭建STUN服务
linux·运维·ubuntu