关于 Linux 的缓冲区

本人在初学 Linux 的过程中,对 Linux 的缓冲区犯了难
● 因为尽管不同的编译器都是基于 C 标准进行实现,但它们实现的方式是不一样的

因为对于现在的我而言,想要彻底了解缓冲区的底层逻辑有点不太可能,所以以下的见解都是实践得出的结果,难免有失偏颇,如果有不对的地方,请指正

★★★本篇笔记对于windows缓冲区无能为力,根本没法用实例解释(因为我用visual studio去测试,结果就是它甚至体现不出来缓冲区,只要我有printf语句它就一定会有相应的输出……而用scanf的话虽然能体现出缓冲区的存在,但又测不出来啥)

关于缓冲区刷新(清空)

何为刷新缓冲区:就是把缓冲区里当前有的数据全都拿出来

程序结束后是否刷新缓冲区

经测试,Linux 不会,Windows不知道:

Linux 下的一行代码用 gcc 编译后运行:

在这里插入图片描述 输出结果:在这里插入图片描述

如果用 Windows下的 Visual Studio 运行:
请添加图片描述

其他刷新方式

Linux :

  1. 读取到 \n 时会刷新缓冲区
  2. 使用诸如 fflush 的函数进行刷新
  3. 缓冲区满了

Windows:

  1. 不是通过读到 \n 进行刷新(可以试试以下的代码)
int main() {
    printf("a\n");
    Sleep(1000);
    printf("已停滞1s\n");
    printf("b");
    Sleep(1000);
    printf("已停滞1s\n");
    return 0;
}
  1. 使用诸如 fflush 的函数进行刷新
  2. 缓冲区满了

缓冲区与输出端的关系

Linux 下有这样一个代码:

#include<stdio.h>
#include<unistd.h>
int main() {
    printf("a\n");
    sleep(1);
    printf("b");
    sleep(1);
    printf("cdefgh\r");
    sleep(1);
    fflush(stdout);
    sleep(1);
    return 0;
}

运行过程:

  1. a进入缓冲区,\n 进入缓冲区,缓冲区清空:
    在这里插入图片描述
  2. 等待一秒,b进入缓冲区,再等待一秒,cdefgh\r 进入缓冲区,再等待一秒,fflush 清空缓冲区:(输出cdefgh,\r 令光标移至本行开头)
    在这里插入图片描述
  3. 等待一秒,程序结束,系统打印的 [hazb@VM-16-8centos code]$ 从光标处打印把 bcdefgh 覆盖,结果呈现出来的就是:
    在这里插入图片描述

也就是说如果你把 cdefgh 稍微写长点:cdefghijklmnopqrstuvwxyzaaaaaaaaaaaaa
那么后两步就是这样的:
在这里插入图片描述
在这里插入图片描述

如果是在Windows的VS里

相应的代码:

#include<stdio.h>
#include<windows.h>
int main() {
    printf("a\n");
    Sleep(1000);
    printf("b");
    Sleep(1000);
    printf("cdefghijklmnopqrstuvwxyzaaaaaaaaaaaaa\r");
    Sleep(1000);
    fflush(stdout);
    Sleep(1000);
    return 0;
}

这个……分析不明白

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值