初识Linux(13) 由基础IO知识简易封装stdio.h中的FILE
本篇作为上文的拓展,可以锻炼一定的代码能力和进一步理清楚在系统中打开的文件的关系。
初识Linux(12) 操作系统基础IO-CSDN博客
根据源码,以及上文的内容,FILE是由IO_FILE被typedef来的
本章主要实现以下四个接口
![]()
函数的实现都到.c中去实现:
其中的size和capacity是用来维护语言缓冲区outbuffer数组的
先只测试第一个函数。
如何在linux中把一个.h和一个.c给联系起来?
两个.o文件可以直接链接起来。.o文件具有可连接属性。
成功了。
fwrite的功能是将进程中的内容向语言缓冲区去写(拷贝),并且在需要刷新时执行刷新。
memcpy的时候注意,要考虑缓冲区可能本来就有内容,所以要在数组的起始位置加上size
mfflush需要注意就是记得让size归零,因为刷新之后缓冲区应该再从0开始加入东西。
mclose:关闭文件时自动文件刷新
测试函数:
每过一秒就cat一下log.txt,就能一行一行的获得内容
但如果此时删掉17行%d之后的\n。每次数据不会刷新,只会不断的往缓冲区去放。
此时应该是直到程序结束才会整体刷新出来。
或者可以直接调用手动刷新:
使用fsync(观察不到太明显的现象):
小结:
FILE是对struct file的再封装,file是偏底层的概念,里面有指向对应的文件内核缓冲区,用户级缓冲区则被封装在FILE中,当fwrite时,先写到FILE的用户级别缓冲区,再通过fflush刷新到内核缓冲区(因为file在FILE中,所以)。如果此时电脑的IO压力不大,就会自动将内核的刷新到外设上,如果压力大,用户又不想等,就可以通过fsnyc将内核的内容刷新到外设上。