为什么标准输出缓冲?

巴鲁克

我正在尝试学习libuvapi并编写了以下测试:

#include <stdio.h>
#include <stdlib.h>
#include <uv.h>

void timer_cb(uv_timer_t* timer) {
    int* i = timer->data;
    --*i;
    if(*i == 0) {
       uv_timer_stop(timer);
    }
    printf("timer %d\n", *i);
    //fflush(stdout);
}

int main() {
    uv_loop_t* loop = uv_default_loop();
    uv_timer_t* timer = malloc(sizeof(uv_timer_t));
    uv_timer_init(loop, timer);
    int i = 5;
    timer->data = &i;
    uv_timer_start(timer, timer_cb, 1000, 2000);

    uv_run(loop, UV_RUN_DEFAULT);

    printf("Now quitting.\n");
    uv_close(timer, 0);
    uv_loop_close(loop);

    return 0;
}

运行它时,直到程序完成运行,才显示任何输出,然后立即显示所有输出。如果我取消注释该fflush行,它将按预期工作,每2秒写入一次。

有人可以向我解释一下吗?为什么stdout换行后不冲洗,如解释在这里和在其他地方?为什么我需要手动冲洗它?

安德鲁·亨利(Andrew Henle)

流缓冲是实现定义的。

根据7.21.3文件C标准的第3段

当流没有缓冲时,字符应尽快从源或目的地出现。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。当流被完全缓冲时,打算在填充缓冲区时将字符作为块与主机环境进行传输。当流被行缓冲时,当遇到换行符时,字符打算作为块与主机环境进行传输。此外,当填充缓冲区,在未缓冲的流上请求输入或在需要从主机环境传输字符的行缓冲的流上请求输入时,打算将字符作为块发送到主机环境。 。对这些特性的支持是实现定义的,并且可能会受到setbufsetvbuf功能的影响

缓冲的类型取决于您的实现,在您的示例中,您的实现显然不是行缓冲。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么“行缓冲区标准输出以确保自动原子地写行”

来自分类Dev

标准输出缓冲问题

来自分类Dev

标准输出缓冲问题

来自分类Dev

git grep输出被缓冲。为什么?

来自分类Dev

为什么标准输出错误消息

来自分类Dev

为什么标准输出错误消息

来自分类Dev

为什么我的PHP输出缓冲不起作用

来自分类Dev

为什么此“ at”命令不能打印到标准输出?

来自分类Dev

为什么此“ at”命令不能打印到标准输出?

来自分类Dev

为什么位缓冲区和缓冲区给我不同的输出?

来自分类Dev

Bash:缓冲整个标准输入,然后输出

来自分类Dev

使用 subprocess.Popen 设置管道:为什么关闭标准输出而不是标准输入?

来自分类Dev

为什么我不能将汇编器输出通过管道传输到标准输出?

来自分类Dev

读取标准模式下的标准输出从无缓冲更改为行缓冲

来自分类Dev

为什么刚创建输出缓冲区时需要刷新它?

来自分类Dev

为什么在每次使用printf时都不必刷新输出缓冲区?

来自分类Dev

为什么stdbuf行不缓冲某些简单C程序的输出

来自分类Dev

为什么代码点火器将视图的输出保存在缓冲区中

来自分类Dev

在* nix系统上管道标准输出/标准错误时,为什么颜色不显示(控制字符)?

来自分类Dev

用Perl解析标准输出时避免缓冲

来自分类Dev

将子标准输出捕获到缓冲区

来自分类Dev

为什么在热循环中写入标准输出会导致内存不足关机?

来自分类Dev

批处理脚本:在这种情况下,为什么不能重定向标准输出?

来自分类Dev

为什么我不能将python脚本的标准输出重定向到文件

来自分类Dev

为什么Python多处理守护进程无法打印到标准输出?

来自分类Dev

为什么`git show`不提供有关重定向标准输出的分支的信息?

来自分类Dev

为什么我的Windows桌面进程似乎没有标准输出立即退出?

来自分类Dev

为什么我不能重定向标准输出/错误以登录Linux

来自分类Dev

为什么scanf()函数可以打印到我的标准输出流?如何抑制这种行为?

Related 相关文章

  1. 1

    为什么“行缓冲区标准输出以确保自动原子地写行”

  2. 2

    标准输出缓冲问题

  3. 3

    标准输出缓冲问题

  4. 4

    git grep输出被缓冲。为什么?

  5. 5

    为什么标准输出错误消息

  6. 6

    为什么标准输出错误消息

  7. 7

    为什么我的PHP输出缓冲不起作用

  8. 8

    为什么此“ at”命令不能打印到标准输出?

  9. 9

    为什么此“ at”命令不能打印到标准输出?

  10. 10

    为什么位缓冲区和缓冲区给我不同的输出?

  11. 11

    Bash:缓冲整个标准输入,然后输出

  12. 12

    使用 subprocess.Popen 设置管道:为什么关闭标准输出而不是标准输入?

  13. 13

    为什么我不能将汇编器输出通过管道传输到标准输出?

  14. 14

    读取标准模式下的标准输出从无缓冲更改为行缓冲

  15. 15

    为什么刚创建输出缓冲区时需要刷新它?

  16. 16

    为什么在每次使用printf时都不必刷新输出缓冲区?

  17. 17

    为什么stdbuf行不缓冲某些简单C程序的输出

  18. 18

    为什么代码点火器将视图的输出保存在缓冲区中

  19. 19

    在* nix系统上管道标准输出/标准错误时,为什么颜色不显示(控制字符)?

  20. 20

    用Perl解析标准输出时避免缓冲

  21. 21

    将子标准输出捕获到缓冲区

  22. 22

    为什么在热循环中写入标准输出会导致内存不足关机?

  23. 23

    批处理脚本:在这种情况下,为什么不能重定向标准输出?

  24. 24

    为什么我不能将python脚本的标准输出重定向到文件

  25. 25

    为什么Python多处理守护进程无法打印到标准输出?

  26. 26

    为什么`git show`不提供有关重定向标准输出的分支的信息?

  27. 27

    为什么我的Windows桌面进程似乎没有标准输出立即退出?

  28. 28

    为什么我不能重定向标准输出/错误以登录Linux

  29. 29

    为什么scanf()函数可以打印到我的标准输出流?如何抑制这种行为?

热门标签

归档