printf的缓冲机制
printf的缓冲机制,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有\n, 则会立即刷新stdout,因此就马上能够打印。在这个例子中:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { printf("hello"); if(0==fork()) { printf(" child\n"); return 0; } printf(" parent\n"); }
运行结果: hello parent hello child |
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { printf("hello\n"); if(0==fork()) { printf(" child\n"); return 0; } printf(" parent\n"); }
运行结果: hello parent child |
1、main函数执行printf(“hello”)后, "hello"仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 hello被子进程继承了,因此在子进程度stdout缓冲里面就也有了"hello"。所以,hello会分别会被父子进程各打印一次。
2、main函数执行printf("hello\n")后,"hello" 被立即打印到了屏幕上(因为有\n),之后fork到的子进程里的stdout缓冲里不会有"hello"内容,因此hello只会被父进程打印一次。
补充:
- 当程序处于交互运行方式时,标准输出通常处于行缓冲方式,所以当输出换行符时,上次的结果才会被真正输出。
- 如果标准输出被定向到一个文件,而标准输出处于全缓冲方式,则当标准I/O清理操作执行时,结果才真正被输出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?