没有'\ n'的printf()在libev中不起作用

时间:2015-07-02 08:22:18

标签: c printf libev

首先发布代码:

#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”很重要?

1 个答案:

答案 0 :(得分:4)

通常,与标准输出关联的缓冲区是行缓冲的。 写入到缓冲区的内容不会立即传输到输出。

最后,\n会将flush缓冲区内容输出到输出。

或者,您可以在fflush(stdout)之后使用printf()而不使用\n,但请记住,这仅适用于输出缓冲区。

FWIW,回答为什么puts() “工作”,引用手册页,(强调我的

  

puts()将字符串s 和尾随换行符写入stdout。

puts()附带了隐式换行符,因此刷新了缓冲区。