博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Printf的缓冲机制
阅读量:4935 次
发布时间:2019-06-11

本文共 1404 字,大约阅读时间需要 4 分钟。

转: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
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/newjiang/p/10711892.html

你可能感兴趣的文章
NNs(Neural Networks,神经网络)和Polynomial Regression(多项式回归)等价性之思考,以及深度模型可解释性原理研究与案例...
查看>>
遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践...
查看>>
从几个简单例子谈随机优化技术
查看>>
linux虚拟化简介
查看>>
JavaBean+Servlet 开发时,JavaBean 编写问题
查看>>
python 与数据结构
查看>>
不同类中self的传递
查看>>
Java JDK API 下载大全
查看>>
简易流水线需改进的问题
查看>>
sql 大数据查询慎用 order by
查看>>
Eclipse项目 迁移到 Intellj IDEA
查看>>
nginx+tomcat+msm(memcached-session-manager)
查看>>
array_intersect_key 函数
查看>>
《A First Course in Abstract Algebra with Applications》-chaper1-数论-关于素数
查看>>
Responsive设计——不同设备的分辨率设置
查看>>
Python编程之数据结构与算法练习_011
查看>>
开博篇
查看>>
需求调研分析
查看>>
Linux系统查看系统是32位还是64位方法总结(转)
查看>>
C#。5 结构体
查看>>