我正在尝试运行以下代码:
#include <sys/time.h>
#include <stdio.h>
int main()
{
unsigned int ms, oldms = 0,dif;
struct timeval tv;
while(1)
{
gettimeofday(&tv, NULL);
ms=tv.tv_sec;
//printf("%d\n",ms-oldms );
dif=ms-oldms;
if(dif>3)
{
printf("3 seconds up");
oldms=ms;
}
}
}
我希望它每 3 秒打印一次“3 seconds up”,但它没有显示该消息。 我尝试使用 gdb 对其进行调试,但似乎没有任何问题,而且仍然没有输出。 在尝试调试时,我添加了一个 printf 语句,神奇地可以看到输出。
如果我在删除//printf("%d\n",ms-oldms ) 后运行程序; statement ,又没有输出。我不确定发生了什么,也不确定它是否依赖于任何东西。
$gcc --版本 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
最佳答案
输出缓冲是原因。
stdout
在连接到终端设备时默认是行缓冲的。您可以使用 fflush(stdout);
或在 printf()
中使用 \n
来清除它,即 printf("3 seconds up\n");
。
或使用 setbuf(stdout, 0);
I/O 通常很慢。因此,实现使用固定大小的缓冲区和 printf 一旦它变满。
实际上,过于频繁地调用 fflush(stdout);
会影响性能。
关于C- while 循环无法解释的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312190/