我在下面的代码中使用ubuntu 14.04版本系统。 我使用下面的代码:(下面的代码是无限循环)
#include <stdio.h>
#include <unistd.h>
int flag=0;
int main(void){
printf("program start.\n");
printf("PID=%d\n",getpid());
printf("flag=%d\n",flag);
//-----------I feel weired below do...while... sentences----------//
do{
printf("loop_");
sleep(1);
}while(flag==0);
printf("program exit.\n");
return 0;
}
在下面的开头打印结果:
root@ubuntu:~/Desktop/my_test_code# ./issue
program start.
PID=3113
flag=0
...........//start waiting here,and don't print "loop_"
然后在我等了很长时间后,这个程序打印了很多“loop_”。 我觉得很奇怪,应该打印一个字符串“loop_”然后,等一下,然后再打印一个“loop_”,依此类推,为什么我等了很久,开始打印很多“ loop_“?
任何人对我的问题都有任何想法。先感谢您。
答案 0 :(得分:5)
printf
缓冲其输出(直到给定大小或\n
),因此您不会看到输出直到它将其刷新。
将循环更改为
printf("loop_");
fflush(stdout);
sleep(1);
应解决您的问题。
答案 1 :(得分:0)
根本原因:
通常stdout的缓冲区被\n
刷新,所以这里循环继续,stdout没有机会正确缓冲其数据。
<强>解决方案:强>
这里有三种方式
1)在printf
的末尾使用\n
printf("loop_\n");
2)在printf循环后调用fflush(stdout):
。
3)使用程序中的以下调用禁用stdout流的缓冲
setvbuf(stdout, NULL, _IONBF, 0);