This question already has answers here:
Why does printf not flush after the call unless a newline is in the format string?
                                
                                    (10个回答)
                                
                        
                                3年前关闭。
            
                    
首先发布代码:

#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.");在main函数中排在首位,但是它没有用。但是,如果我改用printf("hello, world\n");,则一切正常。此外,我更改了printf("hello, world");而不是puts("hello, world");,它也起作用。那么,libev对io做了什么?为什么“ \ n”很重要?

最佳答案

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

最后,\n导致缓冲区内容的flush到输出。

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

FWIW,回答puts()为何有效的问题,引用手册页,(强调我的)


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


puts()提供了一个隐式换行符,因此刷新了缓冲区。

关于c - 没有'\n'的printf()在libev中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31179225/

10-16 19:16