linux-知识点 —— printf()函数打印丢失问题探讨
遇到的一个小问题探讨下。
环境前提:
系统环境:ubuntu 16.04 LTS
gcc 版本:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
在编程过程中 printf() 用的比较多,常见的有info,warning,err 提醒等,但是在实际编程中,发现偶尔存printf(“…”) 的内容丢失问题。就下面一种较为可能的情况,进行编程探讨:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("test printf now...");
sleep(5);
printf("\n");
printf("sleep end...\n");
return 0;
}
如上,发现打印结果是
test printf now...
睡眠 5s 之后,再打印
sleep end...
由此,证明 “printf()” 函数并非即刻打印的,发现有 “\n” 符号出现时立刻打印。
查阅网友测试资料:https://blog.youkuaiyun.com/heluan123132/article/details/78717862
有如下总结:
(1)标准输出设备stdout,输出一般都有缓冲,当遇到刷新标志或缓冲满时才把缓冲的数据输出到标准输出设备中。 (则如果内容仅输出到缓冲中时,程序被挂起或有别的事件发生,导致程序意外提前退出,有可能造成打印丢失。)
(2)对于printf()函数,其使用的输出设备就是标准输出设备stdout,且采用行缓冲式的输出,当printf()遇到\n时,或者缓冲区满时,才会将缓冲区里的内容刷新到标准输出(stdout)。
(3)可以通过 fflush(stdout); ,强制刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
则编程如:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("test printf now...");
fflush(stdout);
sleep(5);
printf("\n");
printf("sleep end...\n");
return 0;
}
发现,在 sleep(5); 执行前,“test printf now…”, 可以即刻输出。