Я только что попробовал официальный пример libev, как показано ниже. После компиляции и запуска я вижу, как только я ввожу что-либо из stdin, событие запускается, никаких проблем. Но то, что я сделал, все еще рассматривается как надежный ввод и затем отображается на моей консоли. У меня вопрос: есть ли способ избежать ввода этого сообщения с консоли на консоль, и так же, как libev, чтобы поймать и сохранить его?
Любой способ в libev может сделать это?
Я вставляю официальный пример здесь:
// a single header file is required
#include <ev.h>
#include <stdio.h> // for puts
// every watcher type has its own typedef'd struct
// with the name ev_TYPE
ev_io stdin_watcher;
ev_timer timeout_watcher;
// all watcher callbacks have a similar signature
// this callback is called when data is readable on stdin
static void
stdin_cb (EV_P_ ev_io *w, int revents)
{
puts ("stdin ready");
// for one-shot events, one must manually stop the watcher
// with its corresponding stop function.
ev_io_stop (EV_A_ w);
// this causes all nested ev_run's to stop iterating
ev_break (EV_A_ EVBREAK_ALL);
}
// another callback, this time for a time-out
static void
timeout_cb (EV_P_ ev_timer *w, int revents)
{
puts ("timeout");
// this causes the innermost ev_run to stop iterating
ev_break (EV_A_ EVBREAK_ONE);
}
int
main (void)
{
// use the default event loop unless you have special needs
struct ev_loop *loop = EV_DEFAULT;
// initialise an io watcher, then start it
// this one will watch for stdin to become readable
ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
ev_io_start (loop, &stdin_watcher);
// initialise a timer watcher, then start it
// simple non-repeating 5.5 second timeout
ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
ev_timer_start (loop, &timeout_watcher);
// now wait for events to arrive
ev_run (loop, 0);
// break was called, so exit
return 0;
}
Я полагаю, вы имеете в виду повторение того, что вы пишете? Это поведение терминала по умолчанию. Ты можешь использовать termios
функции и флаги для отключения эха. Не забудьте включить его перед выходом из программы.
В ev_io_init
Вы устанавливаете, каким будет ваш триггер. Вместо установки STDIN_FILENO вы можете использовать fd из сокета, например. Не знаю, если это то, что вы ищете. Здесь у вас есть пример о чем я говорю.