1. #include <stdio.h>
    2. #include <unistd.h>
    3. int main(void)
    4. {
    5. printf(" I like cows.");
    6. sleep(5);
    7. return 0;
    8. }

    这段代码执行时,只有等到sleep结束,printf的语句才会显示在屏幕上,效果看起来像先sleep,再printf,为什么?

    当printf读进字符串的时候,并不会马上打印,而是先储存在buff里面,当遇到下面4种条件的时候才进行打印:
    1、程序结束:return 0; 或 exit(0);
    2、遇到”\n”
    3、主动刷新fflush(stdout);
    4、缓冲区满

    printf()写入stdout(默认输出流),通常是行缓冲。sleep调用时间不会刷新缓冲区,因此不会显示任何内容,当程序退出所有流时会自动刷新,这就是它在退出之前打印的原因。打印换行符通常会导致流刷新,或者可以使用以下fflush函数:

    1. int main(void)
    2. {
    3. printf(" I like cows.\n");
    4. sleep(5);
    5. return 0;
    6. }

    要么:

    1. int main(void)
    2. {
    3. printf(" I like cows.");
    4. fflush(stdout);
    5. sleep(5);
    6. return 0;
    7. }

    如果要输出到不是行缓冲的流,如果stdout被重定向或者你正在写入文件,打印换行符可能不起作用。在这种情况下,如果想立即写入数据,则应使用fflush。