我正在尝试学习libuv
api并编写了以下测试:
#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
换行后不冲洗,如解释在这里和在其他地方?为什么我需要手动冲洗它?
流缓冲是实现定义的。
根据7.21.3文件,C标准的第3段:
当流没有缓冲时,字符应尽快从源或目的地出现。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。当流被完全缓冲时,打算在填充缓冲区时将字符作为块与主机环境进行传输。当流被行缓冲时,当遇到换行符时,字符打算作为块与主机环境进行传输。此外,当填充缓冲区,在未缓冲的流上请求输入或在需要从主机环境传输字符的行缓冲的流上请求输入时,打算将字符作为块发送到主机环境。 。对这些特性的支持是实现定义的,并且可能会受到
setbuf
和setvbuf
功能的影响。
缓冲的类型取决于您的实现,在您的示例中,您的实现显然不是行缓冲。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句