关于flush的一点体会

来源:互联网 发布:淘宝第三套人民币真假 编辑:程序博客网 时间:2024/04/29 22:33

原来c编程的时候也听说过flush只是没有细细研究。

前两天,老板布置我一个http长连接是否可行的问题,就是从server不停地向http client端发数据。

我用CGI编程,其中就是一个while循环,不停的printf某个字符。打算如下:

while(1)

{

...   

printf("c");//

...

 

}

 

由于不想让这些c字符打印的太快,变修改如下

int count=0;

while(1)

{

...   

 

printf("c");//

count++

sleep(1)

if (10 == count)]

{

...//do something

}

...

 

}

等程序编译好跑起来后,发现并不像设计的那样,一秒打印一个字符。找了好久也没有发现原因,去掉sleep(1)那行就好了。

可原因在哪呢?

 

原来查资料才发现,printf打印的时候是先到缓冲区,如果不到一定的程度就不会打印出来,也有人说printf是行缓冲的。

比如这样一个例子:

#include "stdio.h"

int main (int argc,char **argv)
{
              while (1)
             {
                      printf ("Hello World");
                      sleep(1);
             }
               return 0;
}

 

很简单吧,编译也成功,运行起来就不是一秒给你打印一个"Hello World"了,将上述代码换成如下两种方式就可以了:

第一:

#include "stdio.h"

int main (int argc,char **argv)
{
              while (1)
             {
                      printf ("Hello World");
                      fflush(stdout);
                      sleep(1);
             }
               return 0;
}

第二:

#include "stdio.h"

int main (int argc,char **argv)
{
              while (1)
             {
                      printf ("Hello World/n");
                      sleep(1);
             }
               return 0;
}

查了些资料,说是:

1. int   fflush(FILE   *stream);
会强迫将缓冲区内的数据写回参数stream所指定的文件中。

 

2.  stdout,stdin有缓冲区,stderr没有缓冲区。
fflush()是为了把read或者write的数据立即送到stdout或者stdin那边

今天写在这里,提醒自己,以后碰到如此问题会想到办法,也提醒csdn的朋友。

 

                                                                                                Boatman  2010-8-27

 

原创粉丝点击