我在ubuntu中使用sleep函数,但printf函数在while循环中运行得非常慢。为什么?

时间:2015-12-09 09:37:59

标签: c ubuntu

我在下面的代码中使用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_“?

任何人对我的问题都有任何想法。先感谢您。

2 个答案:

答案 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);