一、libevent库的安装(ubuntu)
- root用户运行以下命令:
apt-get install libevent-dev
- 非root用户:
sudo apt-get install libevent-dev
- 编译命令
gcc 文件名 -o 文件名 -levent
二、libevent-IO事件
步骤:
- 创建事件
- 初始化事件集合
- 初始化事件:把fd和事件ev绑定
- 把事件添加到集合中
- 开始监听
1.event
event 结构体是 libevent 库中的一个核心结构,用于表示一个事件。它包含了事件的各种属性和状态信息,以及与事件相关的回调函数和超时设置。
2.event_init
在 libevent 中,event_init 函数仍然是用于初始化事件的正确函数。
以下是 event_init 函数的用法示例:
void event_init(void);
这个函数用于初始化 libevent 库。它在使用 libevent 之前必须被调用一次。event_init 函数会执行一些必要的初始化操作,以确保 libevent 正常工作。
在调用 event_init 函数后,你可以使用其他 libevent 函数来创建事件、设置事件回调函数、添加事件到事件循环等。
3.event_set
在 libevent 中,event_set 函数用于设置事件的属性和回调函数。它可以用于指定事件的文件描述符、事件类型、回调函数等。
以下是 event_set 函数的用法示例:
int event_set(struct event *ev, int fd, short events, void (*callback)(int, short, void *), void *arg);
参数:
- ev:指向要设置属性的事件结构体的指针。
- fd:事件的文件描述符。
- events:事件的类型
在 libevent 中,事件类型由以下宏定义表示:- EV_TIMEOUT:超时事件,即在指定的时间间隔之后触发。
- EV_READ:读事件,当文件描述符可读时触发。
- EV_WRITE:写事件,当文件描述符可写时触发。
- EV_SIGNAL:信号事件,当指定的信号发生时触发。
- EV_PERSIST:持久事件,即事件在触发后仍然保持激活状态,直到显式删除。
- EV_ET:边缘触发事件,仅在文件描述符状态发生变化时触发一次。
这些宏可以单独使用,也可以通过按位或运算符(|)进行组合,以便同时指定多个事件类型。
- callback:事件发生时要调用的回调函数的指针。
- arg:传递给回调函数的参数。
返回值:
该函数返回一个整数值,表示函数调用的结果。如果成功设置事件属性,则返回 0;否则返回 -1。
4.event_add
在 libevent 中,event_add 函数用于将事件添加到事件循环中,以便在事件发生时触发相应的回调函数。
以下是 event_add 函数的用法示例:
int event_add(struct event *ev, const struct timeval *tv);
参数:
- ev:指向要添加到事件循环的事件结构体的指针。
- tv:指向 struct timeval 结构体的指针,用于指定事件的超时时间。如果为 NULL,事件将无限期地等待触发。
返回值:
该函数返回一个整数值,表示函数调用的结果。如果成功将事件添加到事件循环中,则返回 0;否则返回 -1。
5.event_dispatch
在 libevent 中,event_dispatch 函数用于开始事件循环,等待事件的发生并触发相应的回调函数。
以下是 event_dispatch 函数的用法示例:
int event_dispatch(void);
返回值:
该函数返回一个整数值,表示函数调用的结果。如果事件循环正常结束,则返回 0;否则返回 -1。
6.代码实例
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <event.h>
#include <unistd.h>
#include <stdlib.h>//执行event_set函数时,会把event_set中的fd和ev参数传给回调函数(在这即fifo_read)
void fifo_read(evutil_socket_t fd, short events, void *arg)
{char buf[32] = {0};int ret = read(fd, buf, sizeof(buf));if(-1 == ret){perror("read");exit(3);}printf("从管道读取的内容:%s\n", buf);
}int main()
{ //创建管道int ret = mkfifo("fifo.tmp", 00700);if(-1 == ret){ perror("mkfifo0");exit(1);} int fd = open("fifo.tmp", O_RDONLY);if(-1 == fd) { perror("open");exit(2);}//创建事件struct event ev;//初始化事件集合event_init();//初始化事件(把fd和事件ev绑定)//参数:事件,关联的文件描述符,事件类型,回调函数,回调函数参数event_set(&ev, fd, EV_READ | EV_PERSIST, fifo_read, NULL);//把事件添加到集合中event_add(&ev, NULL);//开始监听event_dispatch(); //死循环,如果集合中没有事件可以监听,则返回return 0;}