2

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

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

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

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

谢谢

4

3 回答 3

4

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

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


另请参阅为什么 printf 在调用后不刷新,除非换行符在格式字符串中?

于 2013-04-24T02:52:31.127 回答
2

尝试将 '\n' 添加到您的 printf 语句中,如下所示:

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

编译器没有乱序执行。只是输出被累积,然后在程序退出时显示。'\n' 将调用 tty 驱动程序中的行规则来刷新输出。

于 2013-04-24T03:21:38.393 回答
0

阅读此问答,它解释了它。

于 2013-04-24T02:54:18.813 回答