sleep()延迟输出直到结束

P M*_*P M 6 c sleep

可能重复:
为什么printf在调用后不会刷新,除非换行符在格式字符串中?(在C中)

嗨,

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

int main() {

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

pax*_*blo 3

实际上并不是睡眠函数延迟了输出,而是标准输出流的缓冲性质。几乎可以肯定,的输出2也会延迟,直到您的程序退出 main,但延迟非常小,您不会注意到它。

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

如果您fflush (stdout)在每次输出调用后都想立即看到,那就可以解决问题。

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

setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Run Code Online (Sandbox Code Playgroud)

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

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

当流未缓冲时,字符会尽快从源或目标出现。否则,字符可能会作为块累积并传输到主机环境或从主机环境传输。

当流完全缓冲时,当缓冲区已满时,字符将作为块传输到主机环境或从主机环境传输。

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

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

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