为什么printf()之后的行是对sleep()的调用,在打印之前执行?
我以为我在这里做了一些简单的事情,但C决定对我进行异步操作。 我不确定发生了什么事。 这是我的代码:
#include int main() { printf("start"); sleep(5); printf("stop"); }
当我编译并运行时,我注意到sleep(5)
就像魅力一样。 但是编译器决定跳过第一个printf()
并且出现故障是个好主意,因此在运行时,程序会等待5秒然后打印startstop
。
这是怎么回事? 我的理论是程序用shell启动打印操作,然后继续执行程序,让Bash等到程序不再忙于实际渲染字符串。 但我真的不知道。
谢谢
printf
使用缓冲输出 。 这意味着数据在刷新到输出源之前首先在内存缓冲区中累积,在这种情况下是stdout
(通常默认为控制台输出)。 在第一个printf
语句之后使用fflush
强制它将缓冲的数据刷新到输出源。
#include int main() { printf("start"); fflush(stdout); sleep(5); printf("stop"); }
另请参阅为什么printf在调用后不会刷新,除非换行符在格式字符串中?
尝试在printf语句中添加’\ n’,如下所示:
#include int main() { printf("start\n"); sleep(5); printf("stop\n"); }
编译器没有按顺序执行此操作。 只是输出累积,然后在程序退出时显示。 ‘\ n’将调用tty驱动程序中的行规则来刷新输出。
阅读此问答,它解释了它。