diff --git a/examples/Makefile.am b/examples/Makefile.am index 8d61f13..5e65d6e 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,3 +1,3 @@ -noinst_PROGRAMS = joystick redirect +noinst_PROGRAMS = ctrl joystick redirect AM_CPPFLAGS = -I$(top_srcdir)/src LDADD = $(top_srcdir)/src/libuev.la diff --git a/examples/ctrl.c b/examples/ctrl.c new file mode 100644 index 0000000..3e825b6 --- /dev/null +++ b/examples/ctrl.c @@ -0,0 +1,74 @@ +/* Example of how to handle signal, in this case Ctrl-C + * + * A common problem for users of libuEV is how to combine it with the + * traditional aspects of UNIX. Since libuEV is just a wrapper for + * signalfd() and epoll(), in this case, it can be worth a dedicated + * example. After all, command line use with Ctrl-C is one of the most + * common use-cases. + */ + +#include +#include +#include "src/uev.h" + +void timeout(uev_t *w, void *arg, int events) +{ + (void)arg; + + if (UEV_ERROR == events) + puts("Ignoring timer watcher error ..."); + + puts("Zero Wing was the pinnacle of gaming https://en.wikipedia.org/wiki/Zero_Wing"); +} + +void teaser(uev_t *w, void *arg, int events) +{ + (void)arg; + + if (UEV_ERROR == events) + puts("Ignoring SIGINT watcher error ..."); + + puts("\nCaught SIGINT ..."); + puts("Sorry, you actually need to press Ctrl-\\ to exit."); +} + +void cleanup(uev_t *w, void *arg, int events) +{ + (void)arg; + + if (UEV_ERROR == events) + puts("Ignoring signal watcher error ..."); + + /* Graceful exit, with optional cleanup ... */ + puts("\nCaught SIGQUIT, exiting."); + + uev_exit(w->ctx); +} + +int main(int argc, char **argv) +{ + uev_ctx_t ctx; + uev_t timerw; + uev_t sig1w; + uev_t sig2w; + + uev_init(&ctx); + + /* example worker, a timer callback */ + uev_timer_init(&ctx, &timerw, timeout, NULL, 100, 2000); + + /* the owls are not what they seem ... */ + uev_signal_init(&ctx, &sig1w, teaser, NULL, SIGINT); + uev_signal_init(&ctx, &sig2w, cleanup, NULL, SIGQUIT); + + puts("Starting, press Ctrl-C to exit."); + + return uev_run(&ctx, 0); +} + +/** + * Local Variables: + * compile-command: "make ctrl; ./ctrl" + * c-file-style: "linux" + * End: + */