libevent 使用

动态库找不到

#include <event2/event.h>

  1. 创建一个事件处理框架
    • 创建event_base
    • struct event_base* event_base_new(void);
    • 失败返回NULL
  2. 创建一个事件
    - event_new()
  3. 事件添加到事件处理框架上
    - event_add();
  4. 开始事件循环
    • 循环监听base对应的事件,等待条件满足
    • event_base_dispatch();
  5. 释放资源
    • 释放event_base
    • event_base_free(struct event_base* base);
  • 查看event_base封装的后端

    • const char** event_get_supported_methods(void); --查看当前系统支持的io转接函数
    • const char* event_base_get_method(const struct event_base* base); --查看系统当前使用的转接函数
  • event_base和fork

    • 子进程创建成功之后,父进程可以继续使用event_base
    • 子进程中需要继续使用event_base需要重新进程初始化
      • int event_reinit(struct event_base* base);

示例读管道

 #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>
  
  // 对操作处理函数
✹ void read_cb(evutil_socket_t fd,short what,void *arg)
  {
      //读管道
      char buf[1024] = {0};
      int len = read(fd,buf,sizeof(buf));
      printf(" data len = %d, buf = %s\n",len,buf);
      printf("read event: %s",what&EV_READ?"yes":"no");
  }
  //读取管道操作
✹ int main(int argc, char *argv[])    
  {
      unlink("myfifo");
      //创建有名管道
      mkfifo("myfifo",0666);                                                               
      // open file
      int fd =  open("myfifo",O_RDONLY | O_NONBLOCK);
      if(fd == -1) 
      {   
       perror("open error");
       exit(1);
      }   
      // 读管道
      // 创建事件处理框架
      struct event_base* base = NULL;
      base = event_base_new();
      // 创建事件
      /*  
       * #define EV_TIMEOUT 废弃
       * #define EV_READ
     * #define EV_WRITE
       * #define EV_SIGNAL
       * #define EV_PERSIST 持续触发
       * #define EV_ET 边沿模式
       * */
      struct event* ev = NULL;
      ev = event_new(base,fd,EV_READ|EV_PERSIST,read_cb,NULL);
      // 添加事件
      /*
       * event_add(
       *  struct event* ev;
       *  const struct timeval* tv;      例: tv = {0,100}
       * )
       * 成功返回0,失败返回-1
       * */
      event_add(ev,NULL);
      // 事件循环
      event_base_dispatch(base);
      // 释放资源
      event_free(ev);
      event_base_free(base);
      close(fd);
      return 0;
  }

示例写管道

  #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <string.h>
  #include <event2/event.h>
  
✹ void write_cb(evutil_socket_t fd,short what,void *arg){
      char buf[1024] = {0};
     static int num = 0;
     sprintf(buf,"hello,world == %d\n",num++);
     write(fd,buf,strlen(buf)+1);
  }
✹ int main(int argc, char *argv[])    
  {
      int fd =  open("myfifo",O_WRONLY|O_NONBLOCK);                                        
     // 创建事件处理框架       
     struct event_base *base = event_base_new();
     // 创建事件
     // 检测的写缓冲区是否有空间写
     struct event* ev = event_new(base,fd,EV_WRITE|EV_PERSIST,write_cb,NULL);
     // 添加事件
     event_add(ev,NULL);
     // 事件循环
     event_base_dispatch(base);
     // 释放资源
     event_base_free(base);
     event_free(ev);
     close(fd);
     
      return 0;
  }

定时器

  #include <iostream>
  #include <event.h>
  using namespace std;                                                                                                            
✹ void onTime(int sock,short event,void* arg)
  {
      cout << "Game Over!"<<endl;
      struct timeval tv;
      tv.tv_sec = 1;
      tv.tv_usec = 0;
  
      // 重新添加定时事件
      event_add((struct event*)arg,&tv);
  }
  int main()
  {
      // 初始化
      event_init();
      struct event evTimer;
      // 设置定时事件
      evtimer_set(&evTimer,onTime,&evTimer);
      struct timeval tv;
      tv.tv_sec = 1;
      tv.tv_usec = 0;
      // 添加定时事件:
      event_add(&evTimer,&tv);
      // 事件循环
      event_dispatch();
      return 0;
  }

posted on 2021-05-10 16:26  lodger47  阅读(42)  评论(0)    收藏  举报

导航