Printf的缓冲机制
2017-12-11 15:48
183 查看
今天用fork()写程序时候,突然发现自己对Printf的缓冲机制还是有些不够了解,于是来深度解析一下,Printf的缓冲机制到底是怎么一回事呢?
首先printf是库函数,它是由C标准库提供的,它是对系统调用函数write()的一层封装,既然是封装,那它就一定会有改进和性能上的提升,达到方便使用的目的,缓冲机制就是其中的一项改进。为了更加透彻的了解printf函数的缓冲机制,我们来看下面的两个例子。
运行环境:gcc (GCC) 4.4.7
代码1:
运行结果1:
hehe
I am father
I am child
代码2:
运行结果2:
heheI am father
heheI am child
相信聪明的你可以看出这两个代码块唯一不同之处在与两个代码开头处的printf,第一个带了\n,第二个并没有带,然而输出结果确实大不相同,究其原因在于printf函数缓冲机制,printf函数实际上只是输出到了标准输出缓冲队列上,并没有实实在在的打印到屏幕上,标准输出是行缓冲机制,也就是说,遇到\n,就会刷新缓冲区,输出到屏幕上,在第一个程序中fork之前已经输出,并刷新了缓冲区,因此子进程不会会继承父进程的这个内容,而在第二个程序中,由于没有遇到换行符,所以字符串"hehe"还在缓冲区中,这时子进程的缓冲区里有也有了这个字符串,所有第二个程序会多打印个"hehe"
拓展:
行缓冲:见到'\n'刷新缓冲区(例如stdout)
全缓冲:见到'\n'不刷新,直到显示fflush()、缓冲区满或者退出才会刷新缓冲区(例如输出文件)
首先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"
拓展:
行缓冲:见到'\n'刷新缓冲区(例如stdout)
全缓冲:见到'\n'不刷新,直到显示fflush()、缓冲区满或者退出才会刷新缓冲区(例如输出文件)
相关文章推荐
- t和printf的缓冲机制
- linux下C语言printf没有输出的问题(shell的行缓冲机制)
- cout和printf的缓冲机制
- cout和printf的缓冲机制
- cout于printf的缓冲机制
- cout和printf的缓冲机制
- [转]cout和printf的缓冲机制
- printf 缓冲机制的问题
- 双缓冲机制
- 标准I/O的缓冲机制的实例讲解
- 《unix环境高级编程》缓冲机制--2
- 深入剖析ASP.NET 2.0缓冲机制
- linux 标准IO缓冲机制探究
- printf重定向后的Log机制
- Velocity模板引擎的缓冲机制
- printf()函数的行缓冲问题
- linux 内存管理、进程的映射、mmap()函数 、mallco()函数的缓冲机制
- 重定向对格式化IO(printf)行缓冲的影响
- linux下编写进度条及三种缓冲机制总结
- STM--KEIL printf打印--ITM机制(亲测成功)