为什么C语言代码中sleep函数会先于printf打印语句执行?
问题原因
这是C语言标准I/O的缓冲机制导致的假象,代码的实际执行顺序没有问题,只是输出内容没有及时打印到终端而已。
默认情况下终端的标准输出采用行缓冲策略,只有满足以下任意一个条件时,缓冲区里的内容才会被刷到终端显示:
- 输出缓冲区被写满
- 输出内容里遇到换行符
\n - 程序主动调用
fflush等接口刷新缓冲区 - 程序正常运行结束退出
你遇到的场景是因为运行环境(比如IDE内置输出面板、将输出重定向到文件等场景)修改了默认缓冲规则,切换为了全缓冲模式:
- 第一条
printf("before\n")执行后,\n没有触发全缓冲模式下的刷新,内容存在内存的输出缓冲区里,没有显示到终端 - 接下来执行
sleep(4),进程休眠期间不会主动刷新缓冲区,所以你看不到任何输出,误以为sleep先执行 sleep结束后执行第二条printf("after"),随后程序退出,系统自动刷新所有残留的输出缓冲区,before和after的内容才会同时显示在终端上
解决方案
如果要保证输出实时生效,可以用以下任意一种方式处理:
- 每次
printf后调用fflush(stdout)手动刷新标准输出缓冲区 - 程序开头调用
setbuf(stdout, NULL)直接关闭标准输出的缓冲机制 - 所有需要实时显示的输出内容末尾都加
\n换行符(仅行缓冲模式下生效,全缓冲场景仍需手动刷新)
内容的提问来源于stack exchange,提问作者Mohamed Elkasimi
相关产品推荐
相关产品推荐

