一、poll
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
fds:监听的文件描述符【数组】
struct pollfd {
int fd; 待监听的文件描述符
short events; 待监听的文件描述符对应的监听事件,取值POLLIN、POLLERR、POLLOUT
short revents; 传入时,给0,如果满足对应事件的话,返回非0----->POLLIN、POLLERR、POLLOUT
};
nfds:监听数组的实际有效个数
timeout:>0 ----超时时长,单位:毫秒
-1:阻塞等待
0:不阻塞
返回值:返回满足对应监听事件的文件描述符的总个数
优点:自带数组结构,可以将监听事件集合和返回事件集合分离,拓展监听上限
缺点:不能跨平台 无法直接定位满足监听事件的文件描述符,编码难度大
突破1024文件描述符限制:
cat/proc/sys/fs/file-max —>当前计算机所能打开的最大文件个数,受硬件影响
ulimit -a -->当前用户下的进程默认打开文件描述符个数。
ulimit -n命令修改 -a查看
ulimit -n 10000
二、epoll
①int epoll_create(int size);
size:创建的红黑树的监听节点数量(仅供内核参考)
返回值:成功:指向新创建的红黑树的根节点的fd
失败:-1 errno
②int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epfd:epoll_create函数的返回值
op:对该监听红黑树所做的操作
EPOLL_CTL_ADD:添加fd到监听红黑树
EPOLL_CTL_MOD:修改fd在监听红黑树上的监听事件
EPOLL_CTL_DEL:将一个fd从监听红黑树上摘下(取消监听)
fd:待监听的fd
event:本质:struct epoll_event 结构体的地址
events:
EPOLLIN/EPOLLOUT/EPOLLERR
data:联合体
int fd:对应监听事件的fd
void*ptr
uint32_t u32
uint64_t u64
③int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);阻塞监听
epfd:epoll_create函数的返回值
events:传出参数,【数组】,满足监听条件的那些fd结构体
maxevents:数组元素的总个数。传入1024 struct epoll_event events[1024]
timeout:-1:阻塞
0:不阻塞
>0:超时时间
返回值:>0满足监听的总个数,可以用作循环上限
0:没有fd监听事件
-1:失败,errno
三、epoll事件模型
ET模式:边沿触发
缓冲区剩余未读尽的数据不会导致epoll_wait返回,新的事件满足,才会触发
LT模式:水平触发
缓冲区剩余未读尽的数据会导致epoll_wait返回