cache vs buffer:open()和creat()执行成功时返回文件描述符, 失败则返回-1
cache代表"读的缓冲区"
buffer代表"写的缓冲区"
区别:
系统调用IO: 每调用一次, 会从user态切换到kernel态执行一次(实时性好)
标准IO: 数据先写入缓冲区, 在某一事件(如: 强制刷新/缓冲区满/换行, 详见上一章对行缓冲/全缓冲/无缓冲的描述)发生时才会将缓冲区内数据写入文件/设备(吞吐量大)
提醒:IO 效率问题
fileno()可以拿出FILE *的fd字段
fdopen()可以将fd封装到FILE *中
但是, 绝不能将标准IO与系统调用IO混用!
绝大多数情况下, FILE结构体中的pos字段与存储文件所有信息的结构体的pos字段值不相等! 如:只代表FILE中的pos加二, 文件结构体的pos没有增加, 该pos只会在各种事件后发生改变; 因此, 标准IO与系统调用IO混用基本就会导致错误, 如ab.c:复制代码
- FILE *fp;
- fputc(fp) // pos ++
- fputc(fp) // pos ++
该程序会打印"bbbaaa", 可以用strace命令跟踪系统调用IO的发生:复制代码
- #include <stdlib.h>
- #include <stdio.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);
- }
该命令输出的最后几行表示系统调用IO发生的过程:复制代码
- strace ./ab
复制代码
- write(1, "b", 1b) = 1
- write(1, "b", 1b) = 1
- write(1, "b", 1b) = 1
- write(1, "aaa", 3aaa) = 3
- exit_group(0) = ?
- +++ exited with 0 +++
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |