转: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\n");
int ret = fork();
if(ret==0)
{
//child
printf("I am child\n");
}
else if(ret<0)
{
printf("Error\n");
}
else
{
printf("I am father\n");
}

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\n");
}
else if(ret<0)
{
printf("Error\n");
}
else
{
printf("I am father\n");
}

return 0;
}
运行结果2:

heheI am father
heheI am child

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

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

拓展:

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

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

Printf的缓冲机制的更多相关文章

  1. java : 包装类 缓冲机制的使用(转载)

    摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i).Byte valueOf(byte b).Short valueOf(short s).Long valueOf(l ...

  2. GO语言练习:channel 缓冲机制

    1.代码 2.运行 3.解析 1.代码 buffer.go package main import ( "fmt" "time" ) func readThre ...

  3. java Swing 图片缓冲机制

    java Swing 图片缓冲机制: 参考:http://jorneyr.iteye.com/blog/868858#comments package util; import java.awt.ge ...

  4. C Mingw gcc printf 刷新缓冲行

    C Mingw gcc printf 刷新缓冲行 参考:https://stackoverflow.com/questions/13035075/printf-not-printing-on-cons ...

  5. MySQL数据库的查询缓冲机制

    MySQL数据库的查询缓冲机制 2011-08-10 11:07 佚名 火魔网 字号:T | T 使用查询缓冲机制,可以极大地提高MySQL数据库查询的效率,节省查询所用的时间.那么查询缓冲机制是怎样 ...

  6. malloc实现机制、缓冲机制、文件操作、mmap虚拟地址(day06)

    一.malloc的实现机制(缓冲机制) 库函数跟系统调用之间的关系 什么是缓冲? 内存分配的原理. 封装 函数A的实现代码中调用了函数B.函数B的功能是函数A主要的功能,这样就说函数A封装了函数B. ...

  7. Qt5双缓冲机制与实例

    1. 双缓冲机制 所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上. 在早期的Qt版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁的现象, ...

  8. 标准IO缓冲机制

    参考资料: https://q16964777.iteye.com/blog/2228244 知道缓冲有几种模式:无缓冲.行缓冲.全缓冲.通过判断FILTE中的 _flags 的判断可以知道究竟是那种 ...

  9. 结合php ob函数理解缓冲机制

    对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来.我也一直如此单纯地认为. 其实,在技术的世界 ...

随机推荐

  1. js修改剪切板内容的方法

    代码如下: //绑定在了body上,也可以绑定在其他可用元素行,但是不是所有元素都支持copy事件. $(document.body).bind({ copy: function(e) {//copy ...

  2. keepalive和脑裂问题

    keepalive keepalive起初专门为lvs负载均衡软件设计的,用来管理监控lvs集群系统中各个服务节点的状态,后来又加入了可以实现高可用的vrrp功能. keepalive软件通过vrrp ...

  3. centos中调整tmpfs分区的大小

    tmpfs是Linux/Unix系统上的一种基于内存的文件系统.tmpfs可以使用系统的内存或swap分区来存储文件.由此可见,tmpfs主要存储暂存的文件. tmpfs默认的大小是RM的一半,假如你 ...

  4. iOS UILable 高度自适

    #import "ViewController.h" #define FontSize 20 @interface ViewController () @end @implemen ...

  5. react-native 学习(三)

    上一次讲到了react-native 的配置环境 和 如何去进行调试,这一次我们说一说,关于react-native的 样式兼容问题. 由于iphonex的发售,在兼容的时候,我门也需要去考虑ipho ...

  6. C#中命名空间别名的使用

    C#中使用命名空间来分割不同的层级,在不同的层级中可以使用相同的类声明和变量声明.在程序中使用不同命名空间的下的相同名称的类时:可以用一下这几种方法进行限定: 1.使用完全限定名 using Syst ...

  7. POJ3150—Cellular Automaton(循环矩阵)

    题目链接:http://poj.org/problem?id=3150 题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现 ...

  8. file结构中的private_data

    private_data是Linux下连接VFS文件系统框架和不同文件/文件系统底层实现之间的一个核心数据结构,虽然它只是一个指针,但是一个指针可以解决所有问题. 因 为file是VFS框架的一个基本 ...

  9. JavaScript自定义函数

    js对象转成用&拼接的请求参数(转) var parseParam=function(param, key){ var paramStr=""; if(param inst ...

  10. vue下使用echarts折线图及其横坐标拖拽功能

    vue页面中使用折线图,并且有时间段筛选.因此就需要用到横坐标的拖拽功能. 界面效果如下: 现在来看这个效果的实现代码: drawLine() { let that = this, lineDate ...