zoukankan      html  css  js  c++  java
  • libevent源码分析:signal-test例子

    signal-test是libevent自带的一个例子,展示了libevent对于信号事件的处理方法。

     1 #include <sys/types.h>
     2 
     3 #include <event2/event-config.h>
     4 
     5 #include <sys/stat.h>
     6 #include <sys/queue.h>
     7 #include <unistd.h>
     8 #include <sys/time.h>
     9 #include <signal.h>
    10 #include <fcntl.h>
    11 #include <stdio.h>
    12 #include <stdlib.h>
    13 #include <string.h>
    14 #include <errno.h>
    15 
    16 #include <event2/event.h>
    17 
    18 int called = 0;
    19 
    20 static void signal_cb(evutil_socket_t fd, short event, void *arg)
    21 {
    22     struct event *signal = arg;
    23 
    24     printf("%s:%d:%s: got signal %d
    ", __FILE__, __LINE__, __func__, event_get_signal(signal));
    25 
    26     if (called >= 2)
    27     {
    28         event_del(signal);
    29     }
    30 
    31     called++;
    32 }
    33 
    34 int main(void)
    35 {
    36     struct event *signal_int;
    37     struct event_base *base;
    38 
    39     /* Initialize the event library */
    40     base = event_base_new();
    41 
    42     /* Initialize one event */
    43     signal_int = evsignal_new(base, SIGINT, signal_cb, event_self_cbarg());
    44 
    45     event_add(signal_int, NULL);
    46 
    47     event_base_dispatch(base);
    48     event_base_free(base);
    49 
    50     return 0;
    51 }
    View Code

    下面就通过分析这个简单的例子来弄清楚libevent对于信号事件是如何处理的:

    1、调用event_base_new方法获取一个event_base对象。

    2、调用evsignale_new方法获取一个event对象。

    3、调用event_add方法激活该event对象。

    4、调用event_dispatch方法启动事件循环。

    5、从事件循环中退出后,释放资源。

    从代码中可以看出,对于信号事件的处理,跟IO事件有差别的地方就是evsignal_new函数,打开evsignale_new函数的定义:

    1 #define evsignal_new(b, x, cb, arg)                
    2     event_new((b), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))

    在include/event2/event.h中有这样一个宏定义,其实evsignal_new就是对event_new的封装。

  • 相关阅读:
    c#——总结两种方式下载模板
    c#——NPOL下载
    c#——泛型类型约束
    Oracle 数据类型
    软件测试绩效评估点
    读《没有带不好的员工》总结
    安装jenkins,配置pipline 运行docker
    K8S pv与pvc匹配不到的坑
    jenkins 在pipeline中运行docker镜像执行测试代码
    k8s 储存卷的定义与使用
  • 原文地址:https://www.cnblogs.com/lit10050528/p/6168455.html
Copyright © 2011-2022 走看看