首页 > 其他分享 >libevent 信号事件实现方式

libevent 信号事件实现方式

时间:2023-02-02 14:36:49浏览次数:54  
标签:int signal base 事件 信号 libevent include event

学会使用libevent,才能真正的掌握其是实现原理,我们先从一个简短的测试用例开始:

复制代码
  1 #include <sys/types.h>
  2 #include <sys/stat.h>
  3 #include <sys/queue.h>
  4 #include <unistd.h>
  5 #include <sys/time.h>
  6 
  7 #include <signal.h>
  8 #include <fcntl.h>
  9 #include <stdlib.h>
 10 #include <stdio.h>
 11 #include <string.h>
 12 #include <errno.h>
 13 #include <event.h>
 14 
 15 
 16 int called = 0;
 17 static void signall_cb(int fd, short event, void *arg)
 18 {
 19     struct event *signal = arg;
 20     printf("%s: got signal %d\n", __func__, EVENT_SIGNAL(signal));
 21     if (called >= 2)
 22         event_del(signal);
 23      called++;
 24 }
 25 int main (int argc, char **argv)
 26 {
 27     struct event signal_int;
 28      /* Initalize the event library */
 29     event_init();
 30     /* Initalize one event */
 31     event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signall_cb, &signal_int);
 32     event_add(&signal_int, NULL);
 33     event_dispatch();
 34     return (0);
 35 }
复制代码

该代码的大体意思是:添加一个信号中断事件,通过CTRL+C,产生中断信号,再调用中断处理函数。

首先分析的是函数是event_init函数,现帖出其具体实现方式

复制代码


复制代码
194 struct event_base *
 195 event_base_new(void)
 196 {
 197     int i;
 198     struct event_base *base;
 199 
 200     if ((base = calloc(1, sizeof(struct event_base))) == NULL)
 201         event_err(1, "%s: calloc", __func__);
 202 
 203     event_sigcb = NULL;
 204     event_gotsig = 0;
 205 
 206     detect_monotonic();
 207     /*如果第一次使用初始化,需要将时间缓存保留,在event_base中保留了一个事件*/
 208     gettime(base, &base->event_tv);
 209     /*初始化最小堆,这个堆里存储的是时间,在I/O复用的函数里是使用最小堆中堆顶的值
 210     作为等待的时间参数,这里只介绍epoll_wait作为I/O复用的方法,这个值就是函数的最后
 211     一个参数,当等待的时间结束,函数返回,也就代表着可能是定时事件被激活
 212     这样也将定时事件集合到I/O事件*/
 213     min_heap_ctor(&base->timeheap);
 214     /*宏作为初始化的,eventqueue是一个event_list,这里面存储着这个event_base所关注的
 215     所有事件*/
 216     TAILQ_INIT(&base->eventqueue);
 217     /*这一对套接字是为了将信号事件融合到I/O事件中所特有的,将其中一个套接字添加到被关注的
 218     行列中,信号事件是通过这一对套接字上来传递的,信号到达,其中一个套接字上有I/O事件,
 219     那么信号到达可以让I/O返回,这样便可将信号事件添加到激活队列中去........*/
 220     base->sig.ev_signal_pair[0] = -1;
 221     base->sig.ev_signal_pair[1] = -1;
 222 
 223     base->evbase = NULL;
 224     /*寻找合适的I/O复用机制,在这里说明,libevent库使用的I/O机制是在编译的时候确定的
 225     其实evbase和某一个复用机制的关系就像类和对象的关系一样,复用机制是evbase的具体实现
 226     */
 227     printf("default is selected %d  %d  %d\n", HAVE_EPOLL, :qHAVE_POLL, HAVE_SELECT);
 228 
 229         /*eventops 是一个全局的结构体,结构体中都是不同内核所支持的几种I/O复用机制*/
 230     for (i = 0; eventops[i] && !base->evbase; i++) {
 231         base->evsel = eventops[i];


复制代码 复制代码 是时候好好总结下自己走过的路。

标签:int,signal,base,事件,信号,libevent,include,event
From: https://www.cnblogs.com/kn-zheng/p/17085884.html

相关文章

  • 微信小程序-通过绑定事件进行传值
    <viewbindtap="node"data-num="5">点击传值:{{nums}}</view> data:{nums:null,},node(e){console.log(e.currentTarget.dataset.num);varn=e......
  • JQuery事件绑定
    事件绑定1.jquery标准的绑定方式js对象.事件方法(回调函数);<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title><scriptsrc......
  • 75、缓存---分布式锁---Redisson信号量测试
    可以用来做分布式限流操作。我们在redis中存储一个数据为3@AutowiredRedissonClientredissonClient;@AutowiredStringRedisTemplateredisTemplate......
  • jQuery_5_操作事件
    通过方法对事件进行操作。  一、给某事件追加监听函数在js中操作事件时,不能给一个事件创建多个监听函数,后者会覆盖前者,而jQuery中操作事件为追加模式。1、追加事件......
  • Qt 事件循环
    一、QT消息/事件循环机制Qt作为一个可视化GUI界面操作系统,是基于事件驱动的,我们程序执行的顺序不再是线性的,而是由一个个应用程序内部或外部的事件进行驱动的,无事件时......
  • 为RecyclerView添加优雅的点击事件、长按事件
    本篇参考:​​Hugo的文章-GettingyourclicksonRecyclerView​​效果如下![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/695c7c9139533136f726431d4f332......
  • react的合成事件
    react自己有一套自己的事件机制,它在DOM事件体系基础上做了改进,减少了内存消耗,并且最大程度的消除了ie等浏览器的不兼容问题。它的特点有以下几个:react上注册的事件最终会......
  • 为RecyclerView添加点击事件、长按事件
    本篇展示手机内已安装的软件信息,并添加事件,效果如下一、准备工作保存App信息的beanpublicclassAppInfo{publicStringname;//应用名publicStringp......
  • 项目运行报错:目标进程已退出,但未引发 CoreCLR 启动事件。
      项目运行报错:目标进程已退出,但未引发CoreCLR启动事件。请确保将目标进程配置为使用.NETCore。如果目标进程未运行.NETCore,则发生这种情况并不意外。 解决方......
  • jQuery对象和JS对象区别与转换 jQuery事件绑定&入口函数&样式控制
    jQuery对象和JS对象区别与转换  JQuery对象和JS对象区别与转换1.JQuery对象在操作时,更加方便。2.JQuery对象和js对象方法不通用的.3.两者相互转换......