2013-04-24 123 views
1

我以为我在这里做了简单的事情,但C决定对我进行异步处理。我不确定发生了什么事。这里是我的代码:为什么在打印任何内容之前,执行printf()函数,调用sleep(),为什么执行?

#include <stdio.h> 
int main() { 
    printf("start"); 
    sleep(5); 
    printf("stop"); 
} 

当我编译和运行,我注意到sleep(5)的作品就像一个魅力。但编译器认为跳过第一个printf()并且出现故障是一个好主意,所以在运行时,程序等待5秒,然后打印startstop

这是怎么回事?我的理论是程序用shell启动打印操作,然后继续执行程序,让Bash等到程序不再忙时再实际渲染字符串。但我真的不知道。

由于

+0

[为什么printf在调用后不刷新,除非换行符在格式字符串中?](http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-这是一个新的电话号码格式的限制) – 2013-04-24 02:54:31

+0

[为什么printf()在sleep()之前不打印任何东西?](https://stackoverflow.com/questions/ 338273/why-does-printf-not-print-anything-before-sleep) – 2017-07-26 22:37:10

回答

3

printf使用缓冲输出。这意味着数据在被刷新到输出源之前首先在内存缓冲区中累积,在这种情况下,该输出源为stdout(通常默认为控制台输出)。在您的第一条printf语句后使用fflush强制它将缓冲的数据刷新到输出源。

#include <stdio.h> 
int main() { 
    printf("start"); 
    fflush(stdout); 
    sleep(5); 
    printf("stop"); 
} 


另见Why does printf not flush after the call unless a newline is in the format string?

+0

谢谢!我应该知道会有更多。起初我以为我有一个流氓Python安装,嫉妒这个C程序与语法简洁性相媲美。 – ICoffeeConsumer 2013-04-24 02:58:25

2

尝试增加 '\ n' 你的printf语句,就像这样:

#include <stdio.h> 
int main() { 
    printf("start\n"); 
    sleep(5); 
    printf("stop\n"); 
} 

编译器不执行这没有秩序。只是输出正在累积,然后在程序退出时显示。 '\ n'将调用tty驱动程序中的行纪录来刷新输出。

相关问题