libevent 封装的最后一个事件是 signal,用起来也很简单。
不过注意一点,就是 libevent 在 signal 到达时,不是立即回调我们注册的接口,而是放到 active event list 中,与 I/O event, timer 一同回调。我认为这个设计是对头滴,hoho~
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <event.h>
void signal_handler(int sig, short events, void *arg)
{
printf("got signal: %s\n", strsignal(sig));
}
void init_signal_handler()
{
struct event *ev1, *ev2;
ev1 = malloc(sizeof(struct event));
signal_set(ev1, SIGUSR1, signal_handler, (void *)ev1);
signal_add(ev1, NULL);
ev2 = malloc(sizeof(struct event));
signal_set(ev2, SIGUSR2, signal_handler, (void *)ev2);
signal_add(ev2, NULL);
}
int main()
{
event_init();
init_signal_handler();
event_dispatch();
return 0;
}
--------------------------------------
$ ./a.out &
[1] 1471
$ ps
PID TT STAT TIME COMMAND
1471 1 S 0:00.00 ./a.out
$ kill -SIGUSR1 1471
got signal: User defined signal 1: 30
$ kill -SIGUSR2 1471
got signal: User defined signal 2: 31
--------------------------------------
评论