Linux 经验
1. 标准IO的行缓存
第一类: c下所有的输入输出函数 printf,scanf,gets...
第二类: fopen,fclose,fread,fwrite,fseek,fgetc,fputc,fgets,fputs,fprintf,fscanf,feof,ferror
缓冲区描述:
1. 读写函数缓冲区分类:
无缓冲(缓存):文件IO
行缓冲(缓存):
全缓冲(缓存):fread,fwrite
2. 除了fread,fwrite是全缓存,其他都是行缓存
3. 行缓存和全缓存有不同的满足条件,在标准IO中实际操作中,无需刻意去记忆缓 存条件,正常情况下都是满足条件的,如果没有满足条件,就无法进行缓存。
例如: int main()
{
printf(“hello”);
_exit(0);
}
运行结果:屏幕上并不会显示hello,因为hello没有写入缓存
int main()
{
printf(“hello\n”);
_exit(0);
}
运行结果:屏幕上会显示hello,因为有\n,hello会写入缓存
4. 行缓存条件:好几个条件(任意满足一个条件即可)
(1) 输入输出函数有换行符 ‘\n’
(2) 程序自然结束(程序中无while(1)或_exit)
(3) 行满:1024个字节
(4) 关闭文件fclose
(5) 强制刷新缓存:fflush(stdout)
5. 全缓存条件:好几个条件(任意满足一个条件即可)
(1) 程序自然结束(程序中无while(1))
(2) 全满:4096个字节
(3) 关闭文件fclose
(4) 强制刷新缓存:fflush(stdout)
注意: 只有满足上述条件,带有缓冲区的文件操作才会起作用;
2. 进程的退出,exit和_exit的区别:
exit:刷新缓冲区(标准IO),将缓冲区内容写入文件
_exit:不刷新缓冲区
示例:
int mian
{
printf(“hello”);
_exit(0);
}
结果: 屏幕上不显示hello,因为,没有刷新缓冲区,也不满足行缓存的条件,如 果hello后面有\n,则可以显示,因
为输入输出函数中有换行符是行缓存 的条件,只有满足条件,才会将缓存中的内容写入文件。
示例:
int mian
{
printf(“hello”);
exit(0);
}
结果:可以显示hello,因为exit函数会先将缓冲区的内容写入缓冲区再退出。