首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么printf()在sleep()之前不打印任何东西?

为什么printf()在sleep()之前不打印任何东西?
EN

Stack Overflow用户
提问于 2008-12-03 18:42:34
回答 4查看 11.2K关注 0票数 22

我正在使用Kernighan和Ritchie的书学习C语言;我正在学习第四章(“函数和程序结构”)的基础知识。前几天我对sleep()函数感到好奇,所以试着这样使用它:

代码语言:javascript
复制
#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)。

EN

回答 4

Stack Overflow用户

发布于 2008-12-03 18:46:23

printf()写入stdout (默认输出流),后者通常是行缓冲的。在调用sleep时,缓冲区不会被刷新,因此不会显示任何内容,当程序退出时,所有的流都会自动刷新,这就是为什么它会在退出前打印出来。打印换行符通常会导致流被刷新,或者您可以使用fflush函数:

代码语言:javascript
复制
int main(void)
{
  printf(" I like cows.\n");
  sleep(5);
  return 0;
}

或者:

代码语言:javascript
复制
int main(void)
{
  printf(" I like cows.");
  fflush(stdout);
  sleep(5);
  return 0;
}

如果打印到没有行缓冲的流,就像stdout被重定向或写入文件时可能出现的情况一样,简单地打印换行符可能不起作用。在这种情况下,如果您希望立即写入数据,则应该使用fflush

票数 43
EN

Stack Overflow用户

发布于 2008-12-03 18:45:06

您的问题是,printf (以及使用stdio库写入stdout (标准输出)的任何其他内容)都是缓冲的-如果它进入控制台,则行缓冲,如果它进入文件,则大小缓冲。如果您在printf之后执行fflush(stdout);,它将执行您想要的操作。您可以尝试在字符串中添加换行符('\n'),只要不将标准输出重定向到文件,这样做是正确的。

我不是百分之百确定,但我认为stderr没有缓冲,这可能会导致混淆,因为您可能会在之前向stdout输出之前看到您对stderr的输出。

票数 8
EN

Stack Overflow用户

发布于 2008-12-03 18:47:16

缓冲意味着所有输出都存储在一个地方(称为缓冲区),并在其中存在一定数量的数据后输出。这样做是出于效率的原因。

一些(大多数?)在写入控制台时,实现将清除换行符后的缓冲区,因此您也可以尝试

代码语言:javascript
复制
printf(" I like cows.\n");

而不是调用fflush()

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/338273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档