我以为我在这里做了一些简单的事情,但C决定对我进行异步操作。我不确定发生了什么。这是我的代码:
#include <stdio.h>
int main() {
printf("start");
sleep(5);
printf("stop");
}
当我编译并运行时,我注意到sleep(5)
就像一个魅力。但是编译器决定跳过第一个printf()
并且不按顺序是个好主意,因此在运行时,程序等待5秒然后打印startstop
。
这笔交易是什么?我的理论是程序用shell启动打印操作,然后继续执行程序,让Bash等到程序不再忙于实际渲染字符串。但我真的不知道。
由于
答案 0 :(得分:3)
printf
使用 缓冲输出 。这意味着数据在刷新到输出源之前首先在内存缓冲区中累积,在这种情况下为stdout
(通常默认为控制台输出)。在第一个fflush
语句后使用printf
强制它将缓冲的数据刷新到输出源。
#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?
答案 1 :(得分:2)
尝试在printf语句中添加'\ n',如下所示:
#include <stdio.h>
int main() {
printf("start\n");
sleep(5);
printf("stop\n");
}
编译器没有按顺序执行此操作。只是输出累积,然后在程序退出时显示。 '\ n'将调用tty驱动程序中的行规则来刷新输出。
答案 2 :(得分:0)