printf的缓冲机制
参考链接:https://www.cnblogs.com/sinferwu/p/12426410.html
printf是C库函数,是对系统调用write的封装,有其特有的缓冲机制。
printf函数实际上只是输出到了标准输出缓冲队列上,并没有实实在在的打印到屏幕上,标准输出是行缓冲机制,也就是说,遇到\n,就会刷新缓冲区,输出到屏幕上
例如有两个程序:
#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
#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
在第一个程序中fork之前已经输出,并刷新了缓冲区,因此子进程不会会继承父进程的这个内容,而在第二个程序中,由于没有遇到换行符,所以字符串"hehe"还在缓冲区中,这时子进程的缓冲区里有也有了这个字符串,所有第二个程序会多打印个"hehe"
内核的缓存是在驱动做的,所有调用printf的程序都共享,但是在应用层的c库也做了缓存,这部分缓存是程序独立的
标签:int,缓冲,printf,ret,child,机制,hehe From: https://www.cnblogs.com/Yuqi0/p/17111990.html