系统IO和标准IO
举例:传达室老大爷跑邮局,有以下两种情况:
- 每来一个人就跑一次邮局。
- 等达到一定数量的信再去一次邮局。
有特殊情况,比如还未达到信的上限,但是有人比较急,这时就直接去送,有点类似与刷新缓冲区fflush。
标准IO具有缓冲的机制,看着已经写进去了,实际上是放到了输出的缓冲区中。
系统调用IO每一次都是从user态切换到kernel态,实时性高。
标准IO吞吐量大,系统调用IO响应速度快。
如何使一个程序变快?
分两个角度作答:
- 是使程序的响应速度快
- 是使程序的吞吐量大
从用户的角度,用户体验感觉到程序变快是指吞吐量。所以在相同情况下,标准IO和系统调用IO都能解决问题的情况下,尽量使用标准IO。
标准IO操作转换为文件IO操作
把File *传入fileno函数中,返回值是这个File文件的文件描述符。
文件IO操作转换为标准IO操作
将已经打开的文件描述符,封装到FILE *中使用。
FILE和文件描述符对应的结构体
下面两个结构体中的pos是否相同?
写一个伪代码:
FILE *fp;
fputc(fp) -> pos++
fputc(fp) -> pos++
执行上述代码后,左边结构体的pos加2,但是右边结构体的pos并没有加2,有一个缓冲区。写入的两个字符并没有写到磁盘上,比如用word修改,关闭时会提示是否保存修改,点保存的话刷新了文件,点不保存的话不会修改文件。
当缓冲区满了,刷新之后右边结构体的pos才会增加。
所以左右两个结构体不一样的,标准IO和文件IO最好不要混用。
代码
源代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
putchar('a');
write(1, "b", 1);
putchar('a');
write(1, "b", 1);
putchar('a');
write(1, "b", 1);
exit(0);
}
运行结果
通过strace ./ab进行观察:
三句putchar是通过一个write来实现的。