原来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