概述
一、基础API
1. 创建 event_base
struct event_base *event_base_new(void);
成功:event_base 指针; 失败:NULL
2. 创建 event事件
struct event *ev = event_new(struct event_base *base,evutil_socket_t fd,
short what,event_callback_fn cb; void *arg);
base: event_base_new()返回值
fd: 绑定到 event 上的 文件描述符
what:事件标志:EV_READ读、EV_WRTIE写、EV_TIMEOUT超时、EV_PERSIST持续、EV_ET边沿触发
cb:一旦事件满足监听条件,回调的函数
typedef void (*event_callback_fn)(evutil_socket_t fd, short what, void *arg)
arg: 回调的函数的参数。
成功:event 指针; 失败:NULL
3. 添加 event事件
int event_add(struct event *ev, const struct timeval *tv);
ev: event_new() 的返回值
tv:超时时长;不使用:NULL
4. 启动事件循环
int event_base_dispatch(struct event_base *base);
base: event_base_new()返回值
5. 释放 event 事件
int event_free(struct event *ev);
6. 释放 event_base
int event_base_free(struct event_base *base);
二、event事件开发框架
- 创建 event_base
struct event_base *base = event_base_new();
- 创建事件 evnet
struct event *ev = event_new();
- 将事件添加到 event_base上
event_add();
- 启动事件循环,监听事件满足则回调函数
event_base_dispatch();
- 释放 event、event_base
event_free();
event_base_free();
三、示例
使用 event 事件通过FIFO实现进程间通信
读端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <event2/event.h>
void read_event_handler(evutil_socket_t fd, short what, void *arg)
{
if (what & EV_READ) { //判断是否为读事件
char buf[128] = {0};
int n = read(fd, buf, sizeof(buf));
if (n <= 0) {
return; //当对端fd关闭,该回调函数会被无限调用,导致read失败返回-1,切勿打印失败信息导致刷屏
} else {
write(STDOUT_FILENO, buf, sizeof(buf));
}
}
}
int main(void)
{
unlink("myfifo"); //删除硬链接,确保管道不存在
int ret = mkfifo("myfifo", 0666);
if (ret == -1) {
perror("mkfifo");
}
int fd = open("myfifo", O_RDONLY);
if (fd == -1) {
perror("open");
}
//创建 event_base
struct event_base *base = event_base_new();
//创建 event 事件
struct event *event = event_new(base, fd, EV_READ | EV_PERSIST, read_event_handler, NULL); //持续触发
//struct event *event = event_new(base, fd, EV_READ, read_event_handler, NULL); //触发一次
//添加 event 事件
event_add(event, NULL);
//启动事件循环
event_base_dispatch(base);
//释放 event、event_base
event_free(event);
event_base_free(base);
close(fd);
return 0;
}
写端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <event2/event.h>
void write_event_handler(evutil_socket_t fd, short what, void *arg)
{
char buf[128] = "helle worldn";
write(fd, buf, sizeof(buf));
sleep(1);
}
int main(void)
{
int fd = open("myfifo", O_WRONLY);
if (fd == -1) {
perror("open");
}
struct event_base *base = event_base_new();
//struct event *event = event_new(base, fd, EV_WRITE, write_event_handler, NULL); //触发一次
struct event *event = event_new(base, fd, EV_WRITE | EV_PERSIST, write_event_handler, NULL); //持续触发
event_add(event, NULL);
event_base_dispatch(base);
event_free(event);
event_base_free(base);
close(fd);
return 0;
}
最后
以上就是霸气鞋垫为你收集整理的libevent库event事件使用的全部内容,希望文章能够帮你解决libevent库event事件使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复