#include <iostream>
#include <event2/event.h>
#include <signal.h>
using namespace std;
//CTRL+C事件函数
static void CTRL_C(int sock, short int which, void* arg)
{
cout<<"CTRL+C"<<endl;
}
static void KILL_SIG(int sock, short int which, void* arg)
{
cout<<"SIGTERM"<<endl;
event* ev = (event*)arg;
//处于非待决状态,则重新添加kill信号(变为持久性事件)
if (!evsignal_pending(ev, NULL))
{
//kill事件先删除再重新添加
event_del(ev);
event_add(ev, NULL);
}
}
int main()
{
event_base *base = event_base_new();
if (!base)
{
cerr<<"event_base_new error"<<endl;
return -1;
}
//添加CTRL+C事件,处于no pending状态
//源码中有隐藏的EV_SIGNAL|EV_PERSIST事件,这个函数是持久性事件
event* evsig = evsignal_new(base, SIGINT, CTRL_C, base);
if (!evsig)
{
cerr<<"evsignal_new error"<<endl;
return -1;
}
//添加事件,处于pending待激活状态
event_add(evsig, 0);
//添加kill信号,非持久性事件,可以使用event_new函数,event_self_cbarg()函数返回的是当前的event
event* evkill = event_new(base, SIGTERM, EV_SIGNAL, KILL_SIG, event_self_cbarg());
if (!evkill)
{
cerr<<"event_new error"<<endl;
return -1;
}
event_add(evkill, 0);
//事件分发,处于循环中
event_base_dispatch(base);
event_free(evsig);
event_base_free(base);
return 0;
}
Makefile
event_signal:event_signal.o
g++ $^ -o $@ -levent
%.o:%.c
g++ -c $^ -o $@
clean:
rm *.o event_signal
运行结果:pkill event_signal后会将事件变为非待决状态,但kill函数中再次添加kill信号
SIGTERM
SIGTERM
^CCTRL+C
^CCTRL+C
^CCTRL+C
^CCTRL+C
Killed //pkill -9 event_signal