多路io轉接伺服器實現的主旨思想是,不再由應用程式自己監視客戶端連線,取而代之由核心替應用程式監視檔案。
select函式:
int select(int nfds,fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
功能:監聽檔案描述符集合,
成功,返回所監聽的集合中滿足條件的總數(並不知道是哪乙個fd,哪乙個事件,需要自己判斷,要監控新的fd需要重新準備要被偵聽的檔案描述符集合)
nfds: 監控的檔案描述符集裡最大檔案描述符加1,因為此引數會告訴核心檢測前多少個檔案描述符的狀態
readfds: 監控有讀資料到達檔案描述符集合,傳入傳出引數
writefds: 監控寫資料到達檔案描述符集合,傳入傳出引數
exceptfds: 監控異常發生達檔案描述符集合,如帶外資料到達異常,傳入傳出引數
timeout: 定時阻塞監控時間,3種情況
1.null,永遠等下去
2.設定timeval,等待固定時間
3.設定timeval裡時間均為0,檢查描述字後立即返回,輪詢
struct timeval epoll_data_t;
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)
功能:等待所監控檔案描述符上有事件的產生
events: 用來存核心得到事件的集合,定義乙個陣列傳進來
maxevents: 告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create()時的size,自定義event陣列的最大值
timeout: 是超時時間
-1: 阻塞
0: 立即返回,非阻塞
>0: 指定毫秒
返回值: 成功返回有多少檔案描述符就緒,時間到時返回0,出錯返回-1;
linux下select和poll的用法
select 函式的作用 系統呼叫select和poll的後端實現,用這兩個系統呼叫來查詢裝置是否可讀寫,或是否處於某種狀態。如果poll為空,則驅動裝置會被認為即可讀又可寫,返回值是乙個狀態掩碼 如何使用select 函式?select 函式的介面主要是建立在一種叫 fd set 型別的基礎上。它...
linux系統下select和poll的實現機理
1.使用者層應用程式呼叫select 2.核心層呼叫sys select do select 最終呼叫檔案描述符fd對應的struct file型別變數的struct file operations f op的poll函式。poll指向的函式返回當前可否讀寫的資訊。1 如果當前可讀寫,返回讀寫資訊。...
Linux下select和poll的用法
select 函式的作用 系統呼叫select和poll的後端實現,用這兩個系統呼叫來查詢裝置是否可讀寫,或是否處於某種狀態。如果poll為空,則驅動裝置會被認為即可讀又可寫,返回值是乙個狀態掩碼 如何使用select 函式?select 函式的介面主要是建立在一種叫 fd set 型別的基礎上。它...