libevent はこんなに便利(2)

libevent はとても便利ですが、日本語の資料が少ないので、ちょっとした tips を紹介いたします。

event_dispatch() 後に綺麗に終了処理をしたい

シグナルで割り込まれたら何らかの処理をしてプログラムを終了したい場合ですね。

私は、この場合以下の様なコードで対応しています。


#include
#include
#include
#include

extern int (*event_sigcb)(void);
extern volatile sig_atomic_t event_gotsig;
static void signal_terminate(int);

int
main(int argc, char *argv[])
{
struct sigaction sa = {};

sigaction(SIGINT, NULL, &sa);
sa.sa_handler = signal_terminate;
sa.sa_flags = SA_NODEFER;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGINT);
sigaction(SIGINT, &sa, NULL);

sigaction(SIGTERM, NULL, &sa);
sa.sa_handler = signal_terminate;
sa.sa_flags = SA_NODEFER;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGTERM);
sigaction(SIGTERM, &sa, NULL);

// libevent の初期化など
event_dispatch();

return (0);
}

static int
signal_terminate_(void)
{
return (-1);
}

static void
signal_terminate(int signal_number)
{
event_sigcb = signal_terminate_;
event_gotsig = signal_number;
}

このようなコードを書いておくと、event_dispatch() から戻ってくることができるので、
その後終了処理などが可能です。