前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >printf行缓冲的概念以及刷新缓冲区的条件

printf行缓冲的概念以及刷新缓冲区的条件

作者头像
lexingsen
发布2022-02-24 15:44:28
9010
发布2022-02-24 15:44:28
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

什么是行缓冲? 当输入输出遇到换行符的这类缓冲定义为行缓冲。标准输入和标准输出都是行缓冲。 引入缓冲区的目的是什么? 简单的讲,设置缓冲区是为提高IO速度,减少CUP等待IO而浪费CPU资源。

大部分磁盘都是机械硬盘,读取寻道时间和写入寻道时间都是在ms级别。 相对于内存读写速度都非常快,因为内存属于电子设备,读写速度时nm级别的。因此在内存上设置IO缓冲区,相对于从磁盘上读写数据可以显著的提高读写速度。 缓冲区刷新的条件: 1.进程结束。 2.遇到\n。 3.缓冲区满。 4.手动刷新缓冲区fflush(stdout)。 5.调用exit(0);但是还可以调用_exit(0),不刷新缓冲区。

下面一一测试缓冲区刷新的条件: (1)进程结束

代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#inckude<sys/types.h>

int main()
{
    pid_t pid = for();
    assert(pid != -1);
    if(pid == 0)//子进程
    {
        printf("aaa");
    }
    else
    {
        sleep(20);//让子进程先获取CPU的控制权,让子进程先结束
        wait();//回收子进程的资源
    }
    return 0;
}
这里写图片描述
这里写图片描述

从执行结果可以看出,当子进程结束后,即进程接受后,缓冲区的内容被输出。 (2)遇到\n

代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<sys/types.h>

int main()
{
    printf("hello");//不加`\n`
    /*printf("hello\n"); 加\n */
    pid_t pid = fork();
    assert(pid != -1);
    if(pid == 0)
    {
        printf("world");
    }
    else
    {
        wait();
    }
    return 0;
}

我们对上边两种情况进行对比: 在这里还需要具备的知识,子进程只会拷贝fork之前父进程缓冲区的内容。 第一种:加\n

这里写图片描述
这里写图片描述

第二种:不加\n

这里写图片描述
这里写图片描述

对比图一和图二,为什么不加\n子进程会输出helloworld而加了\n输出的只有world呢? 因为\n具备刷新缓冲区的作用 当没有添加\n时,父进程缓冲区的内容hello被拷贝到子进程的缓冲区内,因此当子进程结束的时候会输出helloworld,而当添加\n时刷新了父进程的缓冲区,所以进程结束的时候输出的只有子进程缓冲区中的内容world(3)缓冲区满 printf函数的缓冲区大小为1024个字节,当超出缓冲区的大小,缓冲区会被刷新。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档