printf() без '\n' не работает в 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 ответ

Решение

Обычно буфер, связанный со стандартным выводом, является буферизованной строкой. Содержимое, которое записывается в буфер, не сразу передается на выход.

\n, в конце концов, вызывает flush содержимого буфера на выход.

Кроме того, вы можете использовать fflush(stdout), после printf() без \n но помните, это работает только для выходных буферов.

FWIW, чтобы ответить, почему puts() "работает", процитировать man-страницу, (выделение мое)

puts() пишет строку s и завершающий перевод строки в stdout.

есть неявный перевод строки puts() поэтому буфер очищается.

Другие вопросы по тегам