libevent库event事件使用

一、基础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事件开发框架

  1. 创建 event_base
struct event_base *base = event_base_new();
  1. 创建事件 evnet
struct event *ev = event_new();
  1. 将事件添加到 event_base上
event_add();
  1. 启动事件循环,监听事件满足则回调函数
event_base_dispatch();
  1. 释放 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 world\n";

	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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值