1. 准备工作
举个例子:
这里我们要实现my_fopen,my_fwrite和my_fclose这三个函数,并封装MyFILE。
这是MyFILE的封装,然后我们把三个函数接口完成。
2. my_fopen
这是函数的一个框架,首先,我们要判断它是什么方式打开文件。
这里默认读方式打开文件,如果是其它方式打开文件就添加属性。
这里我们就打开文件并开辟空间。
我们这里模拟的是行缓冲。
这里我们打开函数就写完了。
3. my_fwrite
框架如下:
首先,我们要把数据写到缓冲区里面。
然后去判断行缓冲,因为行缓冲的最后一位是\n:
既然遇到了\n了,我们就要把缓冲区的数据写到文件中。
4. my_fclose和my_fflush
在关闭文件前,如果缓冲区里面有数据,那么我们就需要刷新缓冲区,所以我们还要写一个接口:
如果缓冲区里面有数据,那么就全部写入文件中。
关闭文件前要刷新缓冲区。
5. syncfs
但是我们只是写入到内核上,没有写到硬件上。如果我们要写到硬件上,我们需要这个函数:
在刷新完后,要写入磁盘上。
测试:
结果如下:
这里没有\n,所以先写入缓冲区。fork之后,缓冲区发生写时拷贝,两个一起刷新,所以文件里就有两个。
这里我们加了一个\n,我们再看运行情况:
这里fork之前就刷新了,所以缓冲区里没有,所以就一个。