【Linux之IO系统编程学习】04.IO缓存--文件IO与标准IO

 
【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字节)时才会将库缓存写入内核缓存)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值