libevent在 Linux 下信号 事件处理 源码学习

这段代码展示了如何使用libevent库来处理SIGINT(Ctrl+C)和SIGTERM信号。当接收到SIGINT信号时,程序会打印'Ctrl_C';接收到SIGTERM信号时,第一次会打印'Kill',再次发送则会结束程序。通过注释代码的启用,可以使SIGTERM信号变为非持久性,允许程序多次处理该信号。
摘要由CSDN通过智能技术生成

#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);
这个信号可以再次接收处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值