第一次認(rèn)識epoll機(jī)制是在Android中的Handler中的Looper的喚醒和休眠機(jī)制燎猛,后者是利用Linux提供的epoll完成的。
epoll是Linux獨(dú)有的機(jī)制疮蹦,屬于高并發(fā)下的事件驅(qū)動(dòng),是對于select和poll的性能提升。
//頭文件
#include <sys/epoll>
//api
//表示創(chuàng)建一個(gè)epoll句柄
int epoll_create(int _size)
//對上述創(chuàng)建的epoll句柄進(jìn)行操作
int epoll_ctl(int __epoll_fd, int __op, int __fd, struct epoll_event* __event);
//等待處于epoll上被監(jiān)聽的fd產(chǎn)生對應(yīng)的事件
int epoll_wait(int __epoll_fd, struct epoll_event* __events, int __event_count, int __timeout_ms);
- epoll_ctl
- __epoll_fd:epoll句柄讯私,可以認(rèn)為被監(jiān)聽的fd是掛在這個(gè)句柄上的
- __op:本次的操作
- EPOLL_CTL_ADD:向epoll句柄注冊一個(gè)fd
- EPOLL_CTL_MOD:向epoll句柄修改一個(gè)已經(jīng)注冊的fd
- EPOLL_CTL_DEL:刪除一個(gè)已經(jīng)注冊在epoll句柄中的fd
- __fd:被監(jiān)聽的文件描述符
- __event:被監(jiān)聽的事件
- EPOLLIN:表示被監(jiān)聽的fd有可以讀的數(shù)據(jù)
- EPOLLOUT:表示被監(jiān)聽的fd有可以寫的數(shù)據(jù)
- EPOLLPRI:表示有可讀的緊急數(shù)據(jù)
- EPOLLERR:對應(yīng)的fd發(fā)生異常
- EPOLLHUP:對應(yīng)的fd被掛斷
- EPOLLET:設(shè)置EPOLL為邊緣觸發(fā)
- EPOLLONESHOT:只監(jiān)聽一次
//以下是linux-4.12下的源碼
//./include/uapi/linux/eventpoll.h
struct epoll_event {
__u32 events;
__u64 data;
} EPOLL_PACKED
- epoll_wait
- __epoll_fd:epoll句柄
- epoll_event:回傳處理事件的數(shù)組
- __event_count:每次能處理的事件數(shù)
- __timeout_ms:等待IO,-1表示一直阻塞直到來IO被喚醒,大于0表示阻塞指定的時(shí)間后被喚醒。