IO復用函式select poll epoll

2021-08-03 16:29:27 字數 3498 閱讀 7611

#include 

#include

int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const

struct timeval *timeout)

返回值:就緒描述符的數目,超時返回0,出錯返回-1

第乙個引數maxfdp1指定待測試的描述字個數,它的值是待測試的最大描述字加1.

中間的三個引數readset、writeset和exceptset指定我們要讓核心測試讀、寫和異常條件的描述字。如果對某乙個的條件不感興趣,就可以把它設為空指標。struct fd_set可以理解為乙個集合,這個集合中存放的是檔案描述符,可通過以下四個巨集進行設定:

void fd_zero(fd_set *fdset);           //清空集合

void fd_set(int fd, fd_set *fdset); //將乙個給定的檔案描述符加入集合之中

void fd_clr(int fd, fd_set *fdset); //將乙個給定的檔案描述符從集合中刪除

int fd_isset(int fd, fd_set *fdset); // 檢查集合中指定的檔案描述符是否可以讀寫

timeout告知核心等待所指定描述字中的任何乙個就緒可花多少時間。其timeval結構用於指定這段時間的秒數和微秒數。

struct timeval;
#include 

int poll ( struct pollfd * fds, unsigned

int nfds, int timeout);

返回值:就緒描述符的數目,超時返回0,出錯返回-1

pollfd結構體定義如下:

struct pollfd  ;
fd成員指定檔案描述符,events成員告訴poll監聽fd上的哪些事件,它是一系列事件的按位或;revents成員則有核心修改,以通知應用程式fd上實際發生了哪些事件.

poll事件型別:

事件描述

pollin

有資料可讀

pollrdnorm

有普通資料可讀。

pollrdband

有優先資料可讀。

pollpri

有緊迫資料可讀。

pollout

寫資料不會導致阻塞。

pollwrnorm

寫普通資料不會導致阻塞。

pollwrband

寫優先資料不會導致阻塞。

pollmsgsigpoll

訊息可用。

此外,revents域中還可能返回下列事件:

事件描述

poller

指定的檔案描述符發生錯誤。

pollhup

指定的檔案描述符掛起事件。

pollnval

指定的檔案描述符非法。

#include 

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

int epoll_create(int size);
返回值:檔案描述符,出錯返回-1

建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大,這個引數不同於select()中的第乙個引數,給出最大監聽的fd+1的值,引數size並不是限制了epoll所能監聽的描述符最大個數,只是對核心初始分配內部資料結構的乙個建議

當建立好epoll控制代碼後,它就會占用乙個fd值,在linux下如果檢視/proc/程序id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
返回值:成功返回0,出錯返回-1

函式是對指定描述符fd執行op操作。

- epfd:是epoll_create()的返回值。

- op:表示op操作,用三個巨集來表示:新增epoll_ctl_add,刪除epoll_ctl_del,修改epoll_ctl_mod。分別新增、刪除和修改對fd的監聽事件。

- fd:是需要監聽的fd(檔案描述符)

- epoll_event:是告訴核心需要監聽什麼事,struct epoll_event結構如下:

struct epoll_event ;

//events可以是以下幾個巨集的集合:

epollin :表示對應的檔案描述符可以讀(包括對端socket正常關閉);

epollout:表示對應的檔案描述符可以寫;

epollpri:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);

epollerr:表示對應的檔案描述符發生錯誤;

epollhup:表示對應的檔案描述符被結束通話;

epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(level triggered)來說的。

epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到epoll佇列裡

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
返回值:就緒描述符的數目,超時返回0,出錯返回-1

等待epfd上的io事件,最多返回maxevents個事件。

引數events用來從核心得到事件的集合,maxevents告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create()時的size,引數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函式返回需要處理的事件數目,如返回0表示已超時。

工作模式

epoll對檔案描述符的操作有兩種模式:lt(level trigger)和et(edge trigger)。lt模式是預設模式,lt模式與et模式的區別如下:

lt模式:當epoll_wait檢測到描述符事件發生並將此事件通知應用程式,應用程式可以不立即處理該事件。下次呼叫epoll_wait時,會再次響應應用程式並通知此事件。

et模式:當epoll_wait檢測到描述符事件發生並將此事件通知應用程式,應用程式必須立即處理該事件。如果不處理,下次呼叫epoll_wait時,不會再次響應應用程式並通知此事件。

IO復用 poll函式

poll提供的功能與select函式類似,不過在處理流裝置時,它能夠提供額外的資訊 include int poll struct pollfd fdarray,unsigned long nfds,int timeout 返回 若有就緒的描述符則為其數目,若超時則為0,若出錯則為 1 第乙個引數是...

IO復用 poll函式

東陽的學習筆記 poll提供的功能和 select 類似,不過在處理流裝置時,它能提供額外的資訊。include intpoll struct pollfd fdarray,unsigned long nfds,int timeout 第乙個引數時指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙...

IO復用 epoll函式

由於poll 和select 的侷限,2.6核心以上引用了event poll機制 就是說的epoll 雖然比前2個實現複雜得多,epoll解決了它們共有的基本效能問題,並增加了新的特性。poll 和select 每次呼叫的時候,都需要所有被監聽的檔案的描述符。核心必須遍歷所有被監視的檔案描述符。當...