Libevent使用套路

創建一個事件處理框架

    unlink("myfifo");
    //創建有名管道
    mkfifo("myfifo",0664);
    //open file
    int fd = open("myfifo", O_RDONLY|O_NONBLOCK);
  //create write event base
    struct event_base *base=NULL;
    base = event_base_new();

創建一個事件

 //create event
    struct  event* ev = NULL;
    ev = event_new(base, fd, EV_READ|EV_PERSIST, read_cb, NULL);

event添加到event_base框架上

//event add
    event_add(ev, NULL);

開始事件循環

//event circle
    event_base_dispatch(base);

循環停止&釋放資源

 //event free
    event_free(ev);
    event_base_free(base);
    close(fd);

read_cb回調函數

//callback function for read
void read_cb(evutil_socket_t fd, short what, void *arg)
{
    char buf[1024]={0};
    //read fifo
    int len = read(fd,buf, sizeof(buf));
    printf("data len = %d, %s\n", len ,buf);
    printf("read event: %s",what&EV_READ?"Yes":"No");
}

write_fifo

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <event2/event.h>

//callback function for read
void write_cb(evutil_socket_t fd, short what, void *arg)
{
    char buf[1024]={0};
    //write fifo
    static int num = 0;
    sprintf(buf, "hello world == %d\n", num++);

    int len = write(fd,buf, strlen(buf)+1);

}

//write fifo
int main(int argc, const char *argv[])
{
    //unlink("myfifo");
    //創建有名管道
    //mkfifi("myfifo",0664);
    //open file
    int fd = open("myfifo", O_WRONLY|O_NONBLOCK);
    if(fd==-1){exit(1);}
    //create write event base
    struct event_base *base=NULL;
    base = event_base_new();
    //create event
    struct  event* ev = NULL;
    //檢測的是寫緩衝區是否有空間寫
    ev = event_new(base, fd, EV_WRITE, write_cb, NULL); //EV_PERSIST去掉後只寫一次
    //event add
    event_add(ev, NULL);
    //event circle
    event_base_dispatch(base);
    //event free
    event_free(ev);
    event_base_free(base);
    close(fd);

    return 0;

}

libevent 套路圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章