#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 每次呼叫的時候,都需要所有被監聽的檔案的描述符。核心必須遍歷所有被監視的檔案描述符。當...