• Printf的缓冲机制


    转:https://blog.csdn.net/qq_25424545/article/details/78772959

     今天用fork()写程序时候,突然发现自己对Printf的缓冲机制还是有些不够了解,于是来深度解析一下,Printf的缓冲机制到底是怎么一回事呢?

           

           首先printf是库函数,它是由C标准库提供的,它是对系统调用函数write()的一层封装,既然是封装,那它就一定会有改进和性能上的提升,达到方便使用的目的,缓冲机制就是其中的一项改进。为了更加透彻的了解printf函数的缓冲机制,我们来看下面的两个例子。

    运行环境:gcc (GCC) 4.4.7

    代码1:

    #include<stdio.h>
    #include<unistd.h>
    int main()
    {
    printf("hehe ");
    int ret = fork();
    if(ret==0)
    {
    //child
    printf("I am child ");
    }
    else if(ret<0)
    {
    printf("Error ");
    }
    else
    {
    printf("I am father ");
    }

    return 0;
    }
    运行结果1: 

    hehe
    I am father
    I am child

    代码2:

    #include<stdio.h>
    #include<unistd.h>
    int main()
    {
    printf("hehe");
    int ret = fork();
    if(ret==0)
    {
    //child
    printf("I am child ");
    }
    else if(ret<0)
    {
    printf("Error ");
    }
    else
    {
    printf("I am father ");
    }

    return 0;
    }
    运行结果2:

    heheI am father
    heheI am child

           相信聪明的你可以看出这两个代码块唯一不同之处在与两个代码开头处的printf,第一个带了 ,第二个并没有带,然而输出结果确实大不相同,究其原因在于printf函数缓冲机制,printf函数实际上只是输出到了标准输出缓冲队列上,并没有实实在在的打印到屏幕上,标准输出是行缓冲机制,也就是说,遇到 ,就会刷新缓冲区,输出到屏幕上,在第一个程序中fork之前已经输出,并刷新了缓冲区,因此子进程不会会继承父进程的这个内容,而在第二个程序中,由于没有遇到换行符,所以字符串"hehe"还在缓冲区中,这时子进程的缓冲区里有也有了这个字符串,所有第二个程序会多打印个"hehe"

    内核的缓存是在驱动做的,所有调用printf的程序都共享,但是在应用层的c库也做了缓存,这部分缓存是程序独立的

    拓展:

    行缓冲:见到' '刷新缓冲区(例如stdout)

    全缓冲:见到' '不刷新,直到显示fflush()、缓冲区满或者退出才会刷新缓冲区(例如输出文件)
    ---------------------
    作者:T_tangc
    来源:CSDN
    原文:https://blog.csdn.net/qq_25424545/article/details/78772959
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    [VBA]根据身份证号码计算年龄的Excel函数
    [VBA]发布一个计算桩号之差的Excel自定义函数(VBA)
    [VBA]用一个简单例子说明如何在Excel中自定义函数
    元素定位工具:Chrome浏览器ChroPath插件
    68 个 Python 内置函数
    Python错误重试
    jenkins 中展示漂亮的 HTML 测试报告
    python解决接口数据使用了RSA加密和签名
    Python装饰器用法
    Pycharm中文版教程
  • 原文地址:https://www.cnblogs.com/newjiang/p/10711892.html
Copyright © 2020-2023  润新知