read/write函数 常常被称为Unbuffered IO。指的是无用户缓存区。但不保证不使用内核缓存区。我们可以用来验证内核缓存区的大小是不是4096字节。这里我们还用一个系统函数 dup2 文件描述符重定向函数,来实现 从终端输入 直接输出到文件中。
思路很简单,就是测试4096这个临界点。
首先往文件中写4096个字节,查看数据是否写入到磁盘文件,从终端读入数据,缓存区4096数据是否写到磁盘文件。
#include
#include
#include
#include
int main(void)
{
int fd = open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,0664);
char temp[1024]={0};
dup2(fd,STDOUT_FILENO);
//文件重定向后,往终端输出的数据,会写入的文件中
//先写4096B试试,看看能写入磁盘不
for(int i = 0; i < 4096;i++)
{
printf("%c",48);
}
//kernel缓存区大小为4096!写到4097字节,缓冲区溢出才会将缓冲区内容写道磁盘文件,
//缓存区继续放数据
while(1)
{
//读取终端数据
read(STDIN_FILENO,temp,sizeof(temp));
if(strncmp(temp,"exit",4)==0)
break;
printf("%s\n",temp);
}
close(fd);
return 0;
}
程序启动,写入4096字节,但是文件数据却没有
验证结果,写到4097个字节,内核缓存区要溢出了,才将缓冲区内容写到磁盘中去,再将数据写到内核缓存区,等待下一次缓存区满或者文件关闭 才会将缓存区内容写到磁盘。