libevent 使用
动态库找不到
#include <event2/event.h>
- 创建一个事件处理框架
- 创建event_base
- struct event_base* event_base_new(void);
- 失败返回NULL
- 创建一个事件
- event_new() - 事件添加到事件处理框架上
- event_add(); - 开始事件循环
- 循环监听base对应的事件,等待条件满足
- event_base_dispatch();
- 释放资源
- 释放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;
}
浙公网安备 33010602011771号