#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <strings.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <event2/event_struct.h>
#include <fcntl.h>
#include <event.h>
#include <event2/listener.h>
#include <event2/bufferevent_struct.h>
#include <event2/event-config.h>
#include <event2/event.h>
#include <signal.h>
//sock件描述符 which事件类型 arg传递的参数
static void Ctrl_C(int sock,short which ,void *arg )
{
printf("Ctrl_C\n");
}
static void Kill(int sock,short which ,void *arg )
{
printf("Kill\n");
struct event *ev=(struct event *)arg;
//如果处于非待决
/* if(!evsignal_pending(ev ,NULL))
{
event_del(ev);
event_add(ev,NULL);
}*/
}
int main(int argc,char *argv[])
{
struct event_base *base = event_base_new();
if(!base)
{
perror("event base error");
exit(1);
}
struct event *csig= evsignal_new(base ,SIGINT,Ctrl_C,base);
if(!csig)
{
perror("csig error");
exit(1);
}
evsignal_add(csig,//在event_add函数中,通过csig->base获取event_base对象
NULL);//overTime
//非持久事件 只进入一次
struct event *ksig=event_new(base,SIGTERM,EV_SIGNAL,Kill,event_self_cbarg());
if(!ksig)
{
perror("ksig error");
exit(1);
}
evsignal_add(ksig,//在event_add函数中,通过csig->base获取event_base对象
NULL);//overTime
event_base_dispatch(base);
event_free(csig);
event_base_free(base);
}
以上代码执行结果
发ctrl+c 信号 打印输出 Ctrl_C(永久信号)
发kill pid 信号 打印输出一次kill 再发一次kill pid 程序结束
解开Kill里注释代码后 运行发现
设置非持久事件 //如果处于非待决
再次根据需求设置 event_add(ev,NULL);
这个信号可以再次接收处理