• libevent学习四(Working with events)


    1.事件的分类
    1.    文件可写
    2.    文件可读
    3.    超时发生
    4.    信号发生
    5.    用户触发事件
     
    2事件的生命周期
     
         --非 persistent
     
                                                                 event_del(nopending)                                           在callback中通过event_add(重新pending)构成循环
                                                                                 ^                                                                     ^
                                                                                  |                                                                       |
         event_new(initialized)---->event_add(pending)-->事件发生(active)-->callback被调用(stoping)-->event_free(destory)
     
     
       ----persistent
                                                  event_del(nopending)
                                                      ^
                                                       |
       event_new(initialized)-->event_add(pending)->事件发生(active)-->callback被调用(pending)和第二步构成循环->event_free(destory)
     
     
    1. 事件状态
               EV_TIMEOUT:事件超时,应该在event_add的第二个参数设置。这个时间是相对于上一次active发生call_back调用后的时间
                  EV_READ:文件可读
                  EV_WRITE:文件可写
                  EV_SIGNAL:信号发生在一个进程中只应该有一个event_base监听和处理信号,即便有多个,也只有一个会收到信号(即使信号不一样))
               EV_PERSIST:保持pending状态,事件可被多次激活  

                                       Thus, if you have an event with flags EV_READ|EV_PERSIST and a timeout of five seconds, the event will become active:

    •                                   Whenever the socket is ready for reading.

    •                                   Whenever five seconds have passed since the event last became active.
              
                 EV_ET:边缘触发。(状态满足触发一次,而不是条件满足多次触发)
     
     
    接口
     
    #define EV_TIMEOUT      0x01
    #define EV_READ         0x02
    #define EV_WRITE        0x04
    #define EV_SIGNAL       0x08
    #define EV_PERSIST      0x10
    #define EV_ET           0x20

    typedef void (*event_callback_fn)(evutil_socket_t, shortvoid *);

    struct event *event_new(struct event_base *base, evutil_socket_t fd,
        short what, event_callback_fn cb,
        void *arg);

    void event_free(struct event *event);
     
     
    //把事件本身作为回调函数的参数,需要使用下面的api
    void *event_self_cbarg();
     
    //辅助宏
     
    //超时只会被激活一次
    #define evtimer_new(base, callback, arg) 
        event_new((base), -1, 0, (callback), (arg))
    #define evtimer_add(ev, tv) 
        event_add((ev),(tv))
    #define evtimer_del(ev) 
        event_del(ev)
    #define evtimer_pending(ev, tv_out) 
        event_pending((ev), EV_TIMEOUT, (tv_out))
     
     
    #define evsignal_new(base, signum, cb, arg) 
        event_new(base, signum, EV_SIGNAL|EV_PERSIST, cb, arg)
     
     
     
    struct event *hup_event;
    struct event_base *base = event_base_new();

    /* call sighup_function on a HUP signal */
    hup_event = evsignal_new(base, SIGHUP, sighup_function, NULL);
     
    #define evsignal_add(ev, tv) 
        event_add((ev),(tv))
    #define evsignal_del(ev) 
        event_del(ev)
    #define evsignal_pending(ev, what, tv_out) 
        event_pending((ev), (what), (tv_out))
  • 相关阅读:
    Mysql数据库快速备份还原-mysqldump
    写给年轻人的交友和人脉建议
    令人担忧的趋势:科技崇拜与人文失落
    高情商的特征
    高情商与朋友圈
    数据库临时表空间设置
    oracle 临时表空间的增删改查
    语言表达能力写作能力决定一个人的发展和未来
    一个人如何从平庸到优秀,再到卓越?
    06.堆排序
  • 原文地址:https://www.cnblogs.com/manziluo/p/5789636.html
Copyright © 2020-2023  润新知