epoll系統呼叫

2022-06-25 10:30:14 字數 2262 閱讀 7739

1 #include 2

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使用一組函式來完成任務,將使用者感興趣的fd上的事件放在核心裡的乙個事件表中,epoll使用乙個額外的fd來唯一標識核心中的這個事件表。

建立乙個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。

1

struct

epoll_event2;

67typedef union epoll_data

8epoll_data_t; //

聯合體,同一時刻只能儲存乙個成員的值

epoll的事件型別:

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 ...