为什么在printf()之后调用sleep()时,代码输出是在休眠时间之后才显示?

4

我本以为这是一件简单的事情,但是C语言却采用了异步机制,我不确定具体发生了什么。以下是我的代码:

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

当我编译和运行时,我发现 sleep(5) 的效果非常好。但编译器决定跳过第一个 printf(),并且按顺序退出,所以运行程序时,程序会等待 5 秒钟,然后打印出 startstop
这是怎么回事?我的理论是,程序通过 shell 启动打印操作,然后继续执行程序,让 Bash 等待程序不再繁忙才能实际呈现字符串。但我真的不知道。
谢谢

可能是[为什么printf()在sleep()之前不打印任何内容?]的重复问题(https://dev59.com/6HRC5IYBdhLWcg3wUfN2) - Faheel
3个回答

5

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

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

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


谢谢!我应该知道这其中会有更多的东西。起初,我以为我安装的 Python 版本有问题,它嫉妒这个 C 程序在语法简洁性方面比自己的实现还要好。 - ICoffeeConsumer

2
尝试在printf语句中添加'\n',如下所示:
#include <stdio.h>
int main() {
    printf("start\n");
    sleep(5);
    printf("stop\n");
}

编译器并非按照顺序执行该操作,只是将输出累积起来,在程序退出时显示出来。'\n' 会调用 tty 驱动程序中的行规程来刷新缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接