【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

相关推荐
Zwawa3 小时前
用两个按键做一个OLED菜单:先把选择和执行分开
c语言·单片机·嵌入式
2601_967987374 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
feng_you_ying_li4 小时前
linux之数据链路层
linux·网络·智能路由器
GeW5 小时前
高端化走到深处,是数据库和Linux的事
linux
程序员初一6 小时前
Linux 远程桌面有四种做法
linux·ssh
爱吃奥利奥_wen6 小时前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
程序开发阿元6 小时前
1C1G 能跑什么:把留常驻服务和不留摆进一张内存表
linux·ssh
心仪久了会沦陷7 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
xbzb9 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮9 小时前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频