2010-11-17 108 views
6

可能重复:
Why does printf not flush after the call unless a newline is in the format string? (in C)睡眠()延迟输出,直到结束

嗨,

我使用的睡眠()函数在C,并正在到一个问题:我不确定这是否是问题所以我把整个代码煮成这样:

int main() { 

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

    return 0; 
} 

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

感谢

+0

正如我在下面提到的,我不知道这是问题的原因。 – 2010-11-17 03:08:44

回答

3

这不是真正的睡眠功能被延迟输出,这是标准输出流的缓冲性质。 2的输出是几乎肯定也是延迟,直到你的程序退出主程序,但延迟有这么小,你没有注意到它。

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

如果您在fflush (stdout)之后立即看到每个输出呼叫,那就会解决问题。

或者,您也可以在stdout操作之前使用setvbuf,将其设置为无缓冲,你会不会担心将所有这些fflush行代码:

setvbuf (stdout, NULL, _IONBF, BUFSIZ); 

只要记住,如果您将输出发送到文件,可能会影响性能。同时请记住,对此的支持是由实施定义的,并非由标准保证。

ISO C99部7.19.3/3是相关位:

当流是无缓冲,字符旨在尽快从源或目的地出现。否则,字符可能会累积并作为块向主机环境或从主机环境传输。

当一个数据流是完全缓冲,字符是打算作为一个块填充缓冲区时发送到主机环境或从主机环境传输。

当一个流为行缓冲,当遇到换行符时,打算将字符作为块传送到主机环境或从主机环境传送出去。

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

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

1

标准库缓冲区输出,等到有足够的输出摊销的实际印刷成本。

必须在每个印刷后刷新缓冲区,以确保代码继续之前,这将是印:

fflush(stdout); 
+0

它不是执行缓冲的操作系统,它是标准库。 – 2010-11-17 03:06:09

+0

@克里斯 - 谢谢,更正。 – 2010-11-17 03:09:46

1
+3

如果你可以简单地通过链接到另一个问题来回答,它是一个重复的 - 你应该只是发表评论让我们知道,所以我们可以把它作为重复。 – Cascabel 2010-11-17 03:05:06

+0

我不知道这是它背后的问题,我认为这是由sleep()函数中的某些内容引起的,但是会自己添加注释。 – 2010-11-17 03:07:58

0

尝试:

int main() { 

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

    return 0; 
} 

强制IO库清空后睡眠前的缓冲区和返回语句。