1 #include 2epoll使用一組函式來完成任務,將使用者感興趣的fd上的事件放在核心裡的乙個事件表中,epoll使用乙個額外的fd來唯一標識核心中的這個事件表。int epoll_create(int
size);//建立乙個epfd,標識核心中的事件表
3int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event
);//向epfd中新增,刪除,修改事件
4int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);//從epfd中取出實際發生的事件
建立乙個epoll物件epfd。
int epoll_create(int size);
size:給核心乙個提示,告訴核心事件表需要多大;事件表中會維護一棵紅黑樹和乙個雙向鍊錶,將監聽的fd集合放到紅黑樹中,將實際發生事件的fd集合放到雙向鍊錶中。
返回值:返回乙個fd,標識核心事件表;
對epoll物件進行操作,將需要監聽的事件和對應的fd加到核心事件表中的紅黑樹。
int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);
epfd:標識核心事件表的fd;
op:指定操作型別,用三個巨集來表示
epoll_ctl_add-向epfd中註冊fd上的事件;epoll_ctr_mod-在epofd中修改fd上註冊的事件;epoll_ctl_del-從epfd中刪除fd上註冊的事件;
fd:需要操作(監聽)的fd;
event:epoll_event結構指標型別(含需要監聽的事件型別和對應的fd),告訴核心需要監聽事件型別和對應的fd。
1epoll的事件型別:struct
epoll_event2;
67typedef union epoll_data
8epoll_data_t; //
聯合體,同一時刻只能儲存乙個成員的值
epollin-資料可讀;epollrdnorm-普通資料可讀;epollrdband-優先順序帶資料可讀;epollpri-高優先順序資料可讀;
epollout-資料可寫;epollwrnorm-普通資料可寫;epollwrband-優先順序帶資料可寫;
epollrdhup-tcp連線對方關閉或者對方關閉了寫操作;
epollerr-錯誤;epollhup-掛起;epollnval-fd沒有開啟;
epollet-將epoll設為邊緣觸發(et)模式,另一種模式為水平觸發(lt)
模式;epolloneshot-只監聽一次事件,監聽結束後,如果要繼續監聽事件對應的fd,需要將這個fd再次加入到epoll佇列中。
返回值:呼叫成功,返回0;呼叫失敗,返回-1。
監聽(註冊)的事件中實際發生的事件,epoll_wait函式如果檢測到就緒事件,就將就緒事件從epfd標識的核心事件表中的雙向鍊錶中複製到events指向的資料結構中(僅含檢測到的就緒事件)。
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
epfd:標識核心事件表的fd;
events:epoll_event結構型別的鍊錶(鍊錶的的資料域為結構體),實際發生的事件;
maxevents:監聽fd的數量;
timeout:設定epoll的超時時間,單位為毫秒;
返回值:timeout=0,epoll_wait呼叫立即返回,非阻塞;timeout=-1,epoll_wait
呼叫阻塞,直到某個事件發生。
呼叫成功,返回就緒的fd的數量;呼叫失敗,返回-1並設定errno。
lt模式和et模式
採用lt模式的fd,當應用程式呼叫epoll_wait檢測到fd上有事件發生,將發生的事件通知應用程式,應用程式可以不立刻處理該事件,當應用程式下次呼叫epoll_wait時,epoll_wait會繼續將發生的事件通知應用程式,知道該事件被處理;
採用lt模式的fd,當應用程式呼叫epoll_wait檢測到fd上有事件發生,將發生的事件通知應用程式,應用程式必須立刻處理該事件,當應用程式再次呼叫epoll_wait是,將不再將發生的事件通知應用程式。
相比lt模式,et模式減少了事件被重複觸發的次數,效率較高。
epoll系列系統呼叫
需要包含的標頭檔案 include 1.int epoll create int size 在核心新建乙個事件表 這是與select和poll不同的地方 返回這個事件表的檔案描述符,這個檔案描述符將會作為epoll系統呼叫的第乙個引數。另外size引數並不起 作用,只是給核心乙個提示,它的事件表需要...
IO復用 epoll系列系統呼叫
1 核心事件表 epoll是linux特有的i o復用函式。epoll把使用者關心的檔案描述上的事件放在核心裡的乙個事件表中,並用乙個額外的檔案描述符來標識該核心事件表。這個額外檔案描述符使用函式epoll create函式來建立。includeint epoll create int size s...
linux下epoll系統呼叫實現I O復用
epoll系統呼叫 穿件核心事件表,返回指向被建立表的檔案描述符 作為其它epoll函式的第乙個引數 include int epoll create int size epoll ctl實現對核心事件表的操作 int epoll ctl int epfd,int op,int fd,struct ...