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()
поэтому буфер очищается.