首先发布代码:
#define EV_STANDALONE 1
#include <stdio.h>
#include "ev.c"
ev_timer timeout_watcher;
struct ev_loop* loop;
static void timeout_cb (EV_P_ ev_timer *w, int revents)
{
// puts("timeout");
printf("timeout");
ev_timer_again(loop, w);
}
int main (void)
{
printf("hello, world.");
loop = EV_DEFAULT;
ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
timeout_watcher.repeat = 2.0;
ev_timer_start (loop, &timeout_watcher);
ev_run (loop, 0);
return 0;
}
运行时发生了奇怪的事情:尽管printf("hello, world.");
在主要功能中位居第一,但它没有用。但如果我使用printf("hello, world\n");
代替,事情就可以了。此外,我更改了printf("hello, world");
而不是puts("hello, world");
,它也有效。那么libev对io做了什么呢?为什么“\ n”很重要?
答案 0 :(得分:4)
通常,与标准输出关联的缓冲区是行缓冲的。 写入到缓冲区的内容不会立即传输到输出。
最后,\n
会将flush
缓冲区内容输出到输出。
或者,您可以在fflush(stdout)
之后使用printf()
而不使用\n
,但请记住,这仅适用于输出缓冲区。
FWIW,回答为什么puts()
“工作”,引用手册页,(强调我的)
puts()
将字符串s
和尾随换行符写入stdout。
puts()
附带了隐式换行符,因此刷新了缓冲区。