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

标签 c stdout buffering

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

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  printf(" I like cows.");
  sleep(5);
  return 0;
}

问题出在程序的输出上,看起来它先执行了 sleep(),然后才执行了 printf(),换句话说,它等待了五分钟秒,然后打印字符串。所以我想,也许程序到达 sleep() 的速度太快以至于它不会让 printf() 像我想要的那样完成他的工作,即打印字符串然后 sleep 。

如何显示字符串然后让程序休眠? 编译器是 OpenBSD 4.3 中的 GCC 3.3.5 (propolice)。

最佳答案

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

关于c - 为什么 printf() 在 sleep() 之前不打印任何东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/338273/

相关文章:

python - 关闭前冲洗管道 (os.pipe)

c - 为什么下面的输出?

c - union 体中 int 成员和 float 成员的值之间有什么关系?

python - Linux 和 Windows 上标准输出的缓冲差异

在 C 中清除标准输出?

javascript - HTML5 Video buffered 属性特性

c++ - 2个或更多进程如何与键盘交互?

c - 多线程导致 C 语言性能下降

递归查找 "happy"nums 的 C 程序

c - 将标准输出重定向到 C 中的管道