为什么printf()之后的行是对sleep()的调用,在打印之前执行?

时间:2013-04-24 02:51:11

标签: c printf sleep

我以为我在这里做了一些简单的事情,但C决定对我进行异步操作。我不确定发生了什么。这是我的代码:

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

当我编译并运行时,我注意到sleep(5)就像一个魅力。但是编译器决定跳过第一个printf()并且不按顺序是个好主意,因此在运行时,程序等待5秒然后打印startstop

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

由于

3 个答案:

答案 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)