我正在使用Kernighan和Ritchie的书学习C语言;我正在学习第四章(“函数和程序结构”)的基础知识。前几天我对sleep()
函数感到好奇,所以试着这样使用它:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf(" I like cows.");
sleep(5);
return 0;
}
问题是程序的输出,看起来它先执行sleep()
,然后执行printf()
,换句话说,它等待5秒,然后打印字符串。所以我想,也许这个程序到达sleep()
的速度太快了,以至于它没有让printf()
像我想要的那样完成他的工作,那就是打印字符串,然后休眠。
如何显示字符串,然后让程序进入休眠状态?编译器是OpenBSD 4.3中的GCC 3.3.5 (propolice)。
发布于 2008-12-03 18:46:23
printf()
写入stdout
(默认输出流),后者通常是行缓冲的。在调用sleep
时,缓冲区不会被刷新,因此不会显示任何内容,当程序退出时,所有的流都会自动刷新,这就是为什么它会在退出前打印出来。打印换行符通常会导致流被刷新,或者您可以使用fflush
函数:
int main(void)
{
printf(" I like cows.\n");
sleep(5);
return 0;
}
或者:
int main(void)
{
printf(" I like cows.");
fflush(stdout);
sleep(5);
return 0;
}
如果打印到没有行缓冲的流,就像stdout
被重定向或写入文件时可能出现的情况一样,简单地打印换行符可能不起作用。在这种情况下,如果您希望立即写入数据,则应该使用fflush
。
发布于 2008-12-03 18:45:06
您的问题是,printf (以及使用stdio库写入stdout (标准输出)的任何其他内容)都是缓冲的-如果它进入控制台,则行缓冲,如果它进入文件,则大小缓冲。如果您在printf
之后执行fflush(stdout);
,它将执行您想要的操作。您可以尝试在字符串中添加换行符('\n'),只要不将标准输出重定向到文件,这样做是正确的。
我不是百分之百确定,但我认为stderr
没有缓冲,这可能会导致混淆,因为您可能会在之前向stdout
输出之前看到您对stderr
的输出。
发布于 2008-12-03 18:47:16
缓冲意味着所有输出都存储在一个地方(称为缓冲区),并在其中存在一定数量的数据后输出。这样做是出于效率的原因。
一些(大多数?)在写入控制台时,实现将清除换行符后的缓冲区,因此您也可以尝试
printf(" I like cows.\n");
而不是调用fflush()
https://stackoverflow.com/questions/338273
复制相似问题