ev_signal是libev提供的对信号处理的一个模块,基本上是对sigaction函数的一个封装,并将本身是异步的信号转化为同步。ev_signal的使用十分简单:

#include <ev.h>
#include <stdio.h> static void
sigint_cb (struct ev_loop *loop, ev_signal *w, int revents)
{
puts ( "signal ....." );
} int main(int argc,char* argv[])
{
struct ev_loop *loop = EV_DEFAULT; ev_signal signal_watcher;
ev_signal_init (&signal_watcher, sigint_cb, SIGINT);
ev_signal_start (loop, &signal_watcher); ev_run (loop,); return ;
}

C++的用法:

#include <iostream>

#include <ev++.h>
#include <signal.h> class CSignal
{
public:
void sig_cb( ev::sig &w, int revents )
{
std::cout << "catch signal ..." << std::endl;
}
}; int main()
{
CSignal sg; ev::sig sig_watcher;
sig_watcher.set<CSignal,&CSignal::sig_cb>( &sg ); sig_watcher.start(SIGINT); ev_run( EV_DEFAULT, );
}

  然后我们来看一下libev内部处理信号的大概流程:

1.libev有各种各样的watch,包括io、signal、timer,但这些watch基本使用以下结构

typedef struct ev_watcher {
int active;
int pending;
int priority;
void *data;
void (*cb)(struct ev_loop *loop, struct ev_watcher *w, int revents);
} ev_watcher;

2.libev定义了一个全局变量EV_DEFAULT,通过ev_default_loop (0)返回一个指针。其实ev_default_loop是在维护一个全局变量static struct ev_loop default_loop_struct当第一次调用ev_default_loop会初始化default_loop_struct,以后都只是返回它的指针了。这个全局变量自己在维护了所有的watcher。并在一个loop中检测它们是否触发事件。

3.当创建一个ev::sig对象,就创建了一个ev_watcher对象,并通过set函数设置对象指针,回调函数到对象里的data、cb变量,C方式则是通过ev_signal_init、ev_signal_set这些函数来设置。然后把这个watcher交给EV_DEFAULT管理。

4.当调用ev_signal_start函数,会调用signalfd为当前信号创建一个文件描述符,然后通过ev_io来监控该文件的读事件。如果signalfd失败,调用evpipe_init创建一个pipe,注册一个ev_io到epoll中。调用原生的sigaction函数,将回调函数处理为ev_sighandler,收到信号时在ev_sighandler中调用ev_feed_signal来往pipe中写数据。这样在一个loop中,原先的ev_watcher对象就会收到读消息。

  可见,对于大多数使用了libev作为eventloop的程序而言,这样应该是足够简洁方便的。更重要的是,libev有一层C++的wrap,使得在使用C++构建的程序能更方便的调用类的成员函数,而原生的sigaction是不能注册类成员函数为回调函数的。但相对原生的sigaction而言,libev有一个致命的地方:必须要在事件循环中才能收到信号,即ev_run之后。想想,比如你的程序在初始化进入loop之前的时候当掉了,如果这时你想通过捕捉信号来做一些清理工作,libev办不到,sigaction则OK。

浅析libev的ev_signal过程的更多相关文章

  1. 浅析I/O处理过程与存储性能的关系

    浅析I/O处理过程与存储性能的关系 https://community.emc.com/docs/DOC-28653 性能”这个词可以说伴随着整个IT行业的发展,每次新的技术出现,从硬件到软件大多数情 ...

  2. Bytom侧链Vapor源码浅析-节点出块过程

    Bytom侧链Vapor源码浅析-节点出块过程 在这篇文章中,作者将从Vapor节点的创建开始,进而拓展讲解Vapor节点出块过程中所涉及的源码. 做为Vapor源码解析系列的第一篇,本文首先对Vap ...

  3. Linux入门——开机启动过程浅析

    Linux开机启动过程浅析 Introduction 开机启动过程分为以下6个步骤,分别是BIOS, MBR, GRUB, Kernel, Init, RunLevel, RunDefinition ...

  4. 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史

    构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作. 有许多解决方案,但事件驱动也被广泛应用到网络编程中.并大规模部署在高 ...

  5. ibevent 和 libev 提高网络应用性能【转】

    转自:https://www.cnblogs.com/kunhu/p/3632285.html 构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接, ...

  6. libevent 和 libev 提高网络应用性能

    构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作.有许多解决方 案,但是 libevent 库和 libev 库能够大大 ...

  7. 使用 libevent 和 libev 提高网络应用性能

    使用 libevent 和 libev 提高网络应用性能 Martin C. Brown, 作家, Freelance 简介: 构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件, ...

  8. ffmpeg转码步骤源码实现的一点点浅析

    ffmpeg转码实现的一点点浅析 ffmpeg转码过程对解码的处理封装在process_input()中(process_input()->decode_video()->decode() ...

  9. YII 的源码分析(-)

    做为源码分析的首秀,我就挑了yii(读作歪依依而不是歪爱爱):它的赞美之词我就不多说了,直接入正题.先准备材料,建议直从官网下载yii的源码包(1.1.15). 在demos里边有一个最简单的应用—h ...

随机推荐

  1. IOS UIlabel设置文本距离边框距离

    自定义UILabel 继承 UILabel 重写drawTextInRect 方法具体如下: CGRect rect = CGRectMake(rect.origin.x + 5, rect.orig ...

  2. python StringIO标准库基础学习

    #标准库:StringIO提供类文件API文本缓冲区#作用:可以处理内存中的文本,有2种不同的实现:cStringIP版本用c编写提高速度,StringIO用python来提供可移植性,与其他字符串连 ...

  3. pyqt时间

    # -*- coding: utf-8 -*-__author__ = 'Administrator'from PyQt4 import QtCore, QtGui class Help(QtGui. ...

  4. 【转载】cocos2d-x2.2.3和android的平台环境

    这两天试图按照教程来学习写游戏移植到的横版过关Android在.在网上找了很多教程,但版本号变化.所使用的工具有细微的差别.所以,现在我们还没有准备好,阅读后,下面的文章.最后能够顺利您的手机上跑起来 ...

  5. HDU 4588 Count The Carries 计算二进制进位总数

    点击打开链接 Count The Carries Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  6. qt 3d 绘图

    首先不得不说,要感谢北京邮电大学的阿科.感谢他慷慨的分享和极具科学态度的记录,将自己搜集到的众多资料收集整理发布,拯救众多苦逼寻找方案的程序员于苦海之中.因为最近接手新的项目,涉及到使用opengl做 ...

  7. HDU 2074 叠筐

    叠筐 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  8. 阿里云主机SSD实例磁盘测试及IO调度算法调整

    测试背景及环境说明 阿里云ECS 主机配置: 4C8G root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model ...

  9. DevExpress ASPxHtmlEditor控件格式化并导出Word (修复中文字体导出丢失)

    在前台页面中先插入一个ASPxHtmlEditor控件,名为ASPxHtmlEditor1. 我用的Dev版本为14.1 格式化文本 在后台插入如下代码  1     const string css ...

  10. iOS之断点下载,使用NSURLSession简单封装

    最近公司需要做个文件管理的功能模块,刚交到博主手上时,头都大了.因为没做过这方面的东西,只好咬牙加班,并请教某位大神,指点了一下,清楚研究方向,找了网上大量资料,最后实现简单的封装. 上代码:.h文件 ...