sleep()延迟输出直到结束

时间:2010-11-17 03:01:15

标签: c sleep

  

可能重复:
  Why does printf not flush after the call unless a newline is in the format string? (in C)

您好,

我在C中使用sleep()函数,遇到了一个问题:我不确定这是不是问题,所以我将整个代码简化为:

int main() {

  printf("1");
  sleep(3);
  printf("2");

  return 0;
}

我认为这应该产生1 ..等待3秒.. 2.而程序等待3秒然后打印12.有没有办法使用睡眠功能,以便我得到第一个输出?

由于

4 个答案:

答案 0 :(得分:3)

实际上并不是延迟输出的睡眠功能,它是标准输出流的缓冲特性。 2的输出几乎肯定也延迟,直到你的程序退出main,但是那里的延迟很小,你没有注意到它。

标准输出是行缓冲的,如果可以检测到它是指交互设备(否则它是完全缓冲的)。

如果您希望立即看到每个输出调用后fflush (stdout),那么将解决问题。

或者,您可以在操作setvbuf之前使用stdout,将其设置为无缓冲,您不必担心将所有fflush行添加到代码中:< / p>

setvbuf (stdout, NULL, _IONBF, BUFSIZ);

请记住,如果您将输出发送到文件,可能会影响性能。另请注意,对此的支持是实现定义的,不受标准保证。

ISO C99部分7.19.3/3是相关位:

  

当流 unbuffered 时,字符应尽快从源或目的地出现。否则,字符可以作为块累积并传输到主机环境或从主机环境传输。

     

当流完全缓冲时,在填充缓冲区时,字符应作为块传输到主机环境或从主机环境传输。

     

当流行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。

     

此外,当填充缓冲区,在无缓冲流上请求输入时,或者在需要传输字符的行缓冲流上请求输入时,字符旨在作为块传输到主机环境。主机环境。

     

对这些特征的支持是实现定义的,可能会受到setbufsetvbuf函数的影响。

答案 1 :(得分:1)

标准库缓冲输出,等待有足够的输出来分摊实际打印的成本。

每次打印后都必须刷新缓冲区,以确保在代码继续之前打印缓冲区:

fflush(stdout);

答案 2 :(得分:1)

答案 3 :(得分:0)

尝试:

int main() {

  printf("1");  fflush(stdout);
  sleep(3);
  printf("2");  fflush(stdout);

  return 0;
}

强制io库在sleep和return语句之前清空它的缓冲区。