libevent源码浅析(三):libevent的信号的处理

在libevent中通过使用socketpair建立一对流管道,也就是全双工管道,来将信号事件与句柄事件统一起来。

先来看数据结构:

struct evsignal_info {
 struct event ev_signal;  ///<所属的event
 int ev_signal_pair[2];  ///<创建的流管道
 int ev_signal_added;   ///<信号是否已被加入到event中的标记。
 volatile sig_atomic_t evsignal_caught; ///<事件触发标记,1表示有信号被触发 
 struct event_list evsigevents[NSIG];  ///<多个事件有可能注册到同一个信号,因此这里每个信号的事件都是一个event_list.
 sig_atomic_t evsigcaught[NSIG];  ///<由于一个信号可能被注册多次,这里保存信号被捕捉的次数 
#ifdef HAVE_SIGACTION
 struct sigaction **sh_old;
#else
 ev_sighandler_t **sh_old;
#endif
 int sh_old_max;
};

接下来可以看几个主要的函数:

evsignal_init函数主要用来初始化一些数据结构。

void
evsignal_init(struct event_base *base)
{
 int i;

 ///创建一对流管道
 if (evutil_socketpair(
   AF_UNIX, SOCK_STREAM, 0, base->sig.ev_signal_pair) == -1)
 event_err(1, "%s: socketpair", __func__);

    ///设置fd
 FD_CLOSEONEXEC(base->sig.ev_signal_pair[0]);
 FD_CLOSEONEXEC(base->sig.ev_signal_pair[1]);
    ///初始化sig数据结构
 base->sig.sh_old = NULL;
 base->sig.sh_old_max = 0;
 base->sig.evsignal_caught = 0;
 memset(&base->sig.evsigcaught, 0, sizeof(sig_atomic_t)*NSIG);
 /* initialize the queues for all events */
    ///在libevent里面,所有的事件队列都用tail queue实现,linux下它使用的是linux自带的taile queue,具体用法可以去看man手册。
 for (i = 0; i < NSIG; ++i)
 TAILQ_INIT(&base->sig.evsigevents[i]);

    ///设置非阻塞
    evutil_make_socket_nonblocking(base->sig.ev_signal_pair[0]);

    ///初始化event结构
 event_set(&base->sig.ev_signal, base->sig.ev_signal_pair[1],
 EV_READ | EV_PERSIST, evsignal_cb, &base->sig.ev_signal);
 base->sig.ev_signal.ev_base = base;
 base->sig.ev_signal.ev_flags |= EVLIST_INTERNAL;
}

时间: 2024-09-29 06:45:22

libevent源码浅析(三):libevent的信号的处理的相关文章

libevent源码浅析(二):libevent的定时器的实现

在libevent中定时器的实现是通过基于最小堆的优先级队列来实现的. 对于这两个数据结构比较陌生的可以去翻算法导论的6.5节. 主要的源码都在min_heap.c中. 我们先来看主要的数据结构: typedef struct min_heap { struct event** p; unsigned n, a; } min_heap_t; 在这个数据结构中 p也就是整个优先级队列,而这个优先级队列的每个节点都是一个struct *event.n表示这个队列的元素个数.a表示这个队列的大小. 接

libevent源码浅析(一)

这里分析的是libevent-1.4.9. PS:前面还看了libev的源代码,妈的,那代码写的太猥亵了,相比较libevent代码写的好多了.. 首先来看一下最主要的几个数据结构: eventop结构体是所有事件驱动模型的基类.所有的io复用类型都会实现此结构体里各种方法. struct eventop { const char *name; ///<事件驱动名称 void *(*init)(struct event_base *); //<初始化 int (*add)(void *, st

libevent源码浅析(四)

最近刚刚一个项目自己用libevent,因此这几天又把libevent的代码拿出来翻了下,当初看的时候有些似是而非的东西,这次是基本没有了.这篇也算是前面几篇libevent的blog的补充了. struct event_base { const struct eventop *evsel; void *evbase; int event_count; /* counts number of total events */ int event_count_active; /* counts nu

C1000K之Libevent源码分析

 简介 说到异步IO,高并发之类的名词, 可能很多人第一反应就是 select, poll, epoll, kqueue 之类的底层代码库. 但是其实除非你要写一个 Nginx 性能级别的服务器, 否则直接使用 epoll 之类的还是太过底层, 诸多不便,要榨干整个异步编程的高并发性能还需要开发很多相关组件, 而 Libevent 就是作为更好用的高性能异步编程网络库而生, 他帮你包装了各种 buffer 和 event, 甚至也提供了更加高层的 http 和 rpc 等接口, 可以让你脱离

Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没仔细的梳理源码的入门逻辑,今天也就来讲一个源码的玩法,各位看官,一起学习学习! 看本篇博客之前,先看下我的前面两篇 Android源码浅析(一)--VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置 Android源码浅析(二)--Ubuntu Roo

PgSQL · 最佳实践 · pg_rman源码浅析与使用

背景 对于商业数据库来说,备份的功能一般都非常的全面. 比如Oracle,它的备份工具rman是非常强大的,很多年前就已经支持全量.增量.归档的备份模式,支持压缩等. 还支持元数据存储到数据库中,管理也非常的方便,例如保留多少归档,备份集的管理也很方便,例如要恢复到什么时间点,将此前的备份清除等等. 对于开源数据库来说,支持向商业版本这么丰富功能的比较少,PostgreSQL算是非常完善的一个. PostgreSQL作为最高级的开源数据库,备份方面已经向商业数据库看齐. 目前PostgreSQL

我对java String的理解 及 源码浅析

一.char说起到String 这也是自己第二次回过头来啃java基础书,小生自认为愚昧无知.如果大神有好的教育,可以评论私信.以下都是我的看法: 为什么说char 呢,我这里先卖个关子.在java中,char是用unicode编码的,占16位(2字节).从ansi编码(1字节)到unicode编码(2字 节).Java中使用Unicode的原因是,Java的Applet(网页)运行,Unicode里面包含最多最广比如:中 文,English,Spanish,German, French等.因此

苹果推出最受欢迎的iOS 到 民用与商用数据库备份的差异与源码浅析

背景 苹果推出了有史以来最受欢迎的一版iOS,为什么这么受欢迎? 最主要的还是使用了最新的APFS文件系统,这个文件系统几乎集成了ZFS,Btrfs的所有优良特性,比如最为好用的快照(块级增量).压缩.使得苹果的操作系统一下子瘦了,而且备份占用空间也非常小. 对于数据库来说,备份也不是小事,如何实现高效的备份.节省空间的备份以及具备可以定义SLA的恢复(不会随着数据库的大小.REDO的多少而变化). 对于商业数据库来说,备份的功能一般都非常的全面. 比如Oracle,它的备份工具rman是非常强

Android源码浅析(二)——Ubuntu Root,Git,VMware Tools,安装输入法,主题美化,Dock,安装JDK和配置环境

Android源码浅析(二)--Ubuntu Root,Git,VMware Tools,安装输入法,主题美化,Dock,安装JDK和配置环境 接着上篇,上片主要是介绍了一些安装工具的小知识点Android源码浅析(一)--VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置,其实Ubuntu Kylin 16.04 LTS也只是为了体验,我们为了追求稳定,还是使用了Ubuntu14.04 这里提供一个国内镜像的下载链接,可以用迅雷,下载下来之后后缀