【Linux之IO系统编程学习】
项目代码获取:https://gitee.com/chenshao777/linux_-io.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)
04.IO缓存–文件IO与标准IO
文件IO例如 read 、write ,需要包含头文件 unistd.h
标准IO例如 putc、 gets、scanf、printf等,需要包含头文件 stdio.h
他们的区别在于
文件IO会直接把用户缓存数据写到内核缓存中
标准IO在用户存数据和内核缓存之间多了一层库缓存,要遇到 \n 或者将 库缓存填溢出(填满是1024字节) 时才会将库缓存写入内核缓存
例子:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/*不会输出,因为printf是标准IO,
标准IO拥有库缓存
要遇到\n或者将库缓存填满(1024字节)时
才会将库缓存写入内核缓存*/
printf("hello1");
/*
文件IO会直接将用户缓存写入内核缓存
*/
write(1, "hello2", 6);
while(1);
return 0;
}
结果:
hello1不会输出
hc@hc-vm:~/Linux_ARM/git/linux_-io/03.标准IO和文件IO$ ./a.out
hello2
修改成 printf(“hello2\n”);
结果:
hc@hc-vm:~/Linux_ARM/git/linux_-io/03.标准IO和文件IO$ ./a.out
hello1
hello2
测试库缓存的大小
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/*
文件IO会直接将用户缓存写入内核缓存
*/
write(1, "hello2", 6);
/*不会输出,因为printf是标准IO,
标准IO拥有库缓存
要遇到\n或者将库缓存填满(1024字节)时
才会将库缓存写入内核缓存*/
//测试库缓存大小,一共传入128*8=1024个字节
for(int i = 0; i< 128;i++)
printf("hello11 "); //传入库缓存8个字节
while(1);
return 0;
}
结果:
hc@hc-vm:~/Linux_ARM/git/linux_-io/03.标准IO和文件IO$ ./a.out
hello2
修改代码,再传入一个字节到库缓存
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/*
文件IO会直接将用户缓存写入内核缓存
*/
write(1, "hello2", 6);
/*不会输出,因为printf是标准IO,
标准IO拥有库缓存
要遇到\n或者将库缓存填满(1024字节)时
才会将库缓存写入内核缓存*/
//测试库缓存大小,一共传入128*8=1024个字节
for(int i = 0; i< 128;i++)
printf("hello11 "); //传入库缓存8个字节
printf("a"); //上面传了1024个,已经把库缓存填满,再发送一个字节才能把数据发送到内核缓存
while(1);
return 0;
}
结果:
hc@hc-vm:~/Linux_ARM/git/linux_-io/03.标准IO和文件IO$ ./a.out
hello2hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11 hello11
三个缓存的概念(数组):
1.我们的程序中的缓存,就是你想从内核读写的缓存(数组)----用户空间的缓存
2.每打开一个文件,内核在内核空间中也会开辟一块缓存,这个叫内核空间的缓存
文件IO中的写即是将用户空间中的缓存写到内核空间的缓存中。
文件IO中的读即是将内核空间的缓存写到用户空间中的缓存中。
3.标准IO的库函数中也有一个缓存,这个缓存称为----库缓存(遇到\n或者将库缓存填溢出(填满是1024字节)时才会将库缓存写入内核缓存)