标准C库IO介绍
我们在学习C语言时,了解过很多的标准库函数,比如:fopen、fclose、fputs、fgets等,它主要有以下优点:
- 可以跨平台
标准C库IO通过调用系统API来实现的跨平台,比如在Linux下的C标准库函数调用Linux的API,而Windows下的C标准库函数调用Windows下的API,当然不能把编译好的程序直接在另一个操作系统中运行,需要重新编译。补充一点,JAVA也可以跨平台,但是原理不一样,它更具JVM虚拟机来实现的,具体可以参考这篇文章:JAVA跨平台原理 - 效率高
标准C库IO有一个缓冲器(Linux系统IO没有),它可以先将部分数据放入缓冲区中,然后再调用系统AIPI,一次性将缓冲区内的数据全部处理完。
下面这张图可以很好描述标准C库IO函数,以fopen举例:
这里文字简单描述下这幅图的流程:硬盘有一个文件hello.txt,使用fopen(标准C库IO函数)读取hello.txt文件,然后返回一个文件指针FILE*,可以在终端查看fopen函数的具体用法:
man fopen
有了这个文件指针我们就可以往这个文件读数据和写数据了。这个文件指针指向一个结构体,包含:文件描述符(Linux系统API只返回这个),用来索引对应的磁盘文件;文件读写指针,这个指针指向读写文件的实际位置;IO缓冲区的地址,数据先存放到这,然后调用系统API一次性写入磁盘(以写数据为例)。
可以查看FILE*的源代码:
Ctrl+左键转入定义:
可以看到FILE是_IO_FILE结构体的别名,继续查看定义:
缓冲区写入磁盘有三种出发方式:调用fflush函数直接刷新缓冲区;缓冲区满了;正常关闭文件。
标准C库IO和Linux系统IO关系
关系如下所示:
标准C库IO多了一个缓存区,它直接与缓冲区交互,缓冲区通过内核(系统API调用)与磁盘交互。这样看标准C库IO效率更高。
标准C库IO和Linux系统IO使用场景
标准C库IO:从上面可以看出读写磁盘文件的时候,使用标准C库函数比较合适。
Linux系统IO:如果网络通信等实时性要求高的时候,就不能用标准C库函数,因为数据首先要存放在缓冲区,不能直接交互,所以应该使用Linux系统IO函数。