文章目录
- [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

















