libevent5:循环(loop)

运行循环:event_base_loop(struct event_base *base, int flags)
+ flag = 0: event_base_dispatch(base)就是调这个函数传0,一直在循环里。
+ #define EVLOOP_ONCE 0x01 :等待接收一个事件,然后跳出
+ #define EVLOOP_NONBLOCK 0x02 有活动事件就运行,没有直接跳出
+ #define EVLOOP_NO_EXIT_ON_EMPTY 0x04 没有注册事件也不跳出,用于事件后期多线程添加

停止循环:
event_base_loopexit(struct event_base *event_base, const struct timeval *tv);
运行完所有激活事件的回调之后才退出,事件循环没有运行时,下一轮回调完成后立即停止

event_base_loopbreak(struct event_base *event_base)
执行完当前正在处理的事件后立即退出,如无操作则立即退出

以前面test_signal代码,稍作调整:
代码地址:http://121.4.70.4:3000/adminPyf/libevent_study.git
libevent_study/test_loop

#include <iostream>
#include <event2/event.h>
#include <signal.h>

using namespace std;

bool isexit = false;

//sock 文件描述符  which 事件类型 arg传递的参数
static void Ctrl_C(int sock,short which , void* arg){
    cout << "Ctrl_C" << endl;
    event_base * base =  (event_base *)arg;

    //执行完当前事件函数退出
    //event_base_loopbreak(base); 

    //运行完所有的活动事件在退出,事件循环没有运行时,也要等运行一次在退出
    timeval t= {3,0}; //至少运行3s退出
    event_base_loopexit(base,&t);

}

static void Kill(int sock,short which , void* arg){
    cout << "Kill" << endl;

    event *ev = (event*)arg;
    //如果处于非待决
    if(!evsignal_pending(ev,NULL)){
        event_del(ev);
        event_add(ev,NULL); //再次添加进来
    }
}

int main(int agrc,char** agrv){

    event_base *base = event_base_new();

    //添加信号 ctrl+c ,处于no pending 状态
    //evsignal_new 隐藏的状态 EV_SIGNAL|EV_PERSIST
    event *csig = evsignal_new(base,SIGINT,Ctrl_C,base);

    if(!csig){
        cerr << "SIGNAL evsignal_new failed!" << endl;
        return -1;
    }

    if (event_add(csig,0) != 0){
        cerr << "SIGANL event_add failed" << endl;
    }

    //添加kill信号
    //非持久事件,只进入一次 event_self_cbarg()传递当前的event
    event *ksig = event_new(base,SIGTERM,EV_SIGNAL,Kill,
        event_self_cbarg());

    if(!ksig){
        cerr << "SIGNAL evsignal_new failed!" << endl;
        return -1;
    }

    if (event_add(ksig,0) != 0){
        cerr << "SIGANL event_add failed" << endl;
    }
    //进入事件主循环
    //event_base_dispatch(base);

    //EVLOOP_ONCE 等待一个事件运行,直到没有活动事件就退出
    //EVLOOP_NONBLOCK 有活动事件就处理,没有就返回0
    //event_base_loop(base,EVLOOP_NONBLOCK);


    // while (isexit)
    // {
    //     event_base_loop(base,EVLOOP_NONBLOCK);
    // }

    //没有注册事件也不返回,用于事件后期多线程添加
    event_base_loop(base,EVLOOP_NO_EXIT_ON_EMPTY);
    event_free(csig);
    event_base_free(base);

    return 0;

}
libevent5:循环(loop)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动到顶部