Note
利用Libevent创建监听集合,将信号事件绑定并放入监听集合中,一旦监听到有信号发生便会触发
信号事件
注意:编译的时候要加libevent库, gcc 信号.c -o 信号 -levent
/****************************************************************************
Libevent 也可以监听信号
//创建事件集合的方法:使用event_init函数 或者 直接使用 event_base_new
struct event_base *event_init(void)
{
struct event_base *base = event_base_new_with_config(NULL);
if (base == NULL) {
event_errx(1, "%s: Unable to construct event_base", __func__);
return NULL;
}
current_base = base;
return (base);
}
struct event_base *event_base_new(void)
{
struct event_base *base = NULL;
struct event_config *cfg = event_config_new();
if (cfg) {
base = event_base_new_with_config(cfg);
event_config_free(cfg);
}
return base;
}
//把事件和集合绑定,event_set默认把事件与全局变量集合绑定,而event_assign则可以把事件ev和指定current_base集合绑定
void event_set(struct event *ev, evutil_socket_t fd, short events,
void (*callback)(evutil_socket_t, short, void *), void *arg)
{
int r;
r = event_assign(ev, current_base, fd, events, callback, arg);
EVUTIL_ASSERT(r == 0);
}
*******************************************************************************/
#include <stdio.h>
#include <signal.h>
#include <event.h>
int signal_count = 0;
void signal_handler(evutil_socket_t fd, short events, void *arg)
{
struct event *ev = (struct event *)arg;
printf("收到信号 %d \n", fd);
signal_count++;
if(signal_count >= 2)
{
//把事件从集合中删除
event_del(ev);
}
}
int main()
{
//创建事件集合,ps:记得释放集合
struct event_base *base = event_base_new();
//创建事件
struct event ev;
//将事件和信号绑定
//参数:事件 集合 信号(crtl+c) 类型 回调函数 回调函数入参(把集合传给回调,用于达到一定条件终止循环)
event_assign(&ev, base, SIGINT, EV_SIGNAL | EV_PERSIST, signal_handler, &ev);
//事件添加到集合中
event_add(&ev, NULL);
//监听集合(自己创建的集合,不使用event_dispatch默认监听全局变量集合)
//event_dispatch();
event_base_dispatch(base);
//释放集合
event_base_free(base);
return 0;
}


