我只是用Kernighan和Ritchie的书学习C语言; 我在第四章的基础知识(函数).前几天我对这个sleep()功能感到好奇,所以试着像这样使用它:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf(" I like cows.");
sleep(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是程序的输出,它看起来像sleep()第一个然后printf(),换句话说,它等待五秒然后打印字符串.所以我想,也许程序变得sleep()如此之快,以至于它不会让printf()我的工作按照我的意愿完成,即打印字符串然后再睡觉.
如何显示字符串然后让程序进入睡眠状态?编译器是OpenBSD 4.3中的GCC 3.3.5(propolice).
PS我不知道你如何正确地放置预处理器线.
Rob*_*ble 35
printf()写入stdout(默认输出流),通常是行缓冲.sleep调用时间不会刷新缓冲区,因此不会显示任何内容,当程序退出所有流时会自动刷新,这就是它在退出之前打印的原因.打印换行符通常会导致流刷新,或者您可以使用以下fflush函数:
int main(void)
{
printf(" I like cows.\n");
sleep(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要么:
int main(void)
{
printf(" I like cows.");
fflush(stdout);
sleep(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果要打印到不是行缓冲的流,如果stdout重定向或者您正在写入文件,可能就是打印新行可能不起作用.在这种情况下,fflush如果您希望立即写入数据,则应使用.
您的问题是 printf(以及使用 stdio 库写入 stdout(标准输出)的任何其他内容)被缓冲 - 如果它进入控制台,则缓冲行,如果进入文件则缓冲大小。如果你在fflush(stdout);之后做printf,它会做你想做的。您可以尝试只在字符串中添加一个换行符 ('\n'),只要您不将标准输出重定向到文件,这就会做正确的事情。
我不是 100% 确定,但我认为stderr没有缓冲,这可能会导致混淆,因为您可能会看到您在stderr之前所做的输出之前所做的输出stdout。
缓冲是指所有的输出都存储在一个地方(称为缓冲区),并在其中存在一定量的数据后输出。这样做是出于效率原因。
一些(大多数?)实现在写入控制台时清除换行符后的缓冲区,因此您也可以尝试
printf(" I like cows.\n");
Run Code Online (Sandbox Code Playgroud)
而不是调用 fflush()