epoll函数
头文件
#include <sys/epoll.h>
epoll_create函数
该函数用于创建一个 epoll
实例,返回一个文件描述符,后续的 epoll
操作会使用这个文件描述符。
函数原型
int epoll_create(int flags);
参数
flags
:可以传入 0
或者 EPOLL_CLOEXEC
。当传入 EPOLL_CLOEXEC
时,在执行 exec
系列函数时会自动关闭该文件描述符,防止子进程继承。若传入 0
,则无此特性。
返回值
成功时返回一个新的 epoll
实例的文件描述符。
失败时返回 -1
,并设置 errno
来指示错误类型。
epoll_ctl函数
对 epoll
实例进行控制操作,比如添加、修改或删除要监控的文件描述符及其对应的事件。
函数原型
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数
epfd
:epoll_create1
返回的epoll
实例的文件描述符。
op
:指定操作类型,有以下三种取值:
EPOLL_CTL_ADD
:将文件描述符fd
加入到epoll
实例的监控列表中。
EPOLL_CTL_MOD
:修改已经在epoll
实例监控列表中的文件描述符fd
对应的事件。
EPOLL_CTL_DEL
:将文件描述符fd
从epoll
实例的监控列表中移除。
fd
:要进行操作的文件描述符。
event
:指向struct epoll_event
结构体的指针,用于指定要监控的事件类型。struct epoll_event
的定义如下:typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */ };
events
可以是以下一些常用事件标志的组合:
EPOLLIN
:表示对应的文件描述符可读(有数据可读)。
EPOLLOUT
:表示对应的文件描述符可写(可以写入数据)。
EPOLLET
:将epoll
设置为边缘触发(Edge Triggered)模式,默认是水平触发(Level Triggered)模式。
data
是一个联合体,通常会使用fd
成员来存储要监控的文件描述符。
返回值
成功时返回 0
。
失败时返回 -1
,并设置 errno
来指示错误类型。
epoll_wait函数
等待 epoll
实例中监控的文件描述符上的事件发生。当有事件发生时,该函数会返回发生事件的文件描述符数量,并将这些事件的信息存储在 events
数组中。
函数原型
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
参数
epfd
:epoll_create1
返回的epoll
实例的文件描述符。
events
:用于存储发生事件的struct epoll_event
结构体数组。
maxevents
:events
数组的最大元素个数,即最多能存储的事件数量。
timeout
:超时时间,单位为毫秒。有以下几种取值情况:
-1
:表示无限等待,直到有事件发生。
0
:表示立即返回,不管是否有事件发生。大于
0
:表示等待指定的毫秒数,如果在这段时间内没有事件发生,则返回0
。
返回值
成功时返回发生事件的文件描述符数量。
超时且无事件发生时返回 0
。
失败时返回 -1
,并设置 errno
来指示错误类型。