io多路復用(多路轉接)
在沒有io多路復用技術前,程序在同一時間只能監控乙個io狀態(乙個檔案描述符的狀態),例如a和b兩個檔案在操作,定的順序是a前b後,那麼在a阻塞過程中、b在後面也是不能被操作的,這樣會造成資源浪費、響應緩慢。
io多路復用:同時監控多個io檔案描述符狀態,如果沒有準備好的描述符、則程序始終處於睡眠狀態(或超時返回);在監控期間內 如果有準備好的描述符,則立刻告訴程序,程序開始處理就緒的描述符。
兩種方法解決io多路復用,epoll後續部落格再說。
方法一 select :
int select (int n, // 所有集合中檔案描述符的最大值+1
fd_set *readfds, // 需監控的讀 描述符集合
fd_set *writefds, // 需監控的寫 描述符集合
fd_set *exceptfds, // 需監控的異常/帶外資料的 描述符集合
struct timeval *timeout); // 超時時間
// 其中timeout引數:
/* 時間結構體 */
struct timeval ;
select在等待時間範圍內,沒有準備好的描述符,則會阻塞等待;在此期間 如果有檔案描述符就緒,立刻返回。
返回值:通常情況下返回所有就緒的檔案描述符的數目,發生錯誤返回-1 。
且在返回時,各描述符集合中 只保留 就緒的檔案描述符。
select呼叫超過一定時間(引數timeout),還沒有準備好的描述符,則 select() 呼叫返回0(就緒的描述符數量為0)。
以下是管理檔案描述符集合的巨集:
/* 以下是一些巨集,管理檔案描述符集合 */
fd_clr(int fd, fd_set *set); // 從set集合中移除乙個描述符fd
fd_isset(int fd, fd_set *set); // 測試某描述符fd是否在set集合中。返回值:0-不在;非負值-在
fd_set(int fd, fd_set *set); // 向set集合中新增乙個描述符fd
fd_zero(fd_set *set); // 從set集合中移除所有描述符
程式示例:
#include #include #include #include int main() else if (select_rslt == 0) else ;
int n_read = read(stdin_fileno, buf, 10);
if (n_read == -1)
fputs(buf, stdout);}}
return 0;
}
方法二 poll :
int poll (struct pollfd *fds, // struct pollfd的陣列
unsigned int nfds, // 上面陣列中的元素個數
int timeout); // 等待的時間長度(毫秒),負數表示永遠等待,0表示立即返回
// 其中 struct pollfd如下:
struct pollfd ;
引數fds說明: 乙個struct pollfd代表乙個檔案描述符,結構內:fd是檔案描述符值,events是用來被使用者(即程式設計師)設定希望可監聽的屬性(例如可讀、可寫等等),revents是核心返回時設定的已發生的事件(例如這個描述符已經可寫、可讀等等)。
返回值:返回pollfd結構體中,revents非零的結構體的個數(其實就是有事件發生的描述符個數)。
並且在返回時,可檢視相應檔案描述符的pollfd結構中的 revents欄位,根據此欄位判斷描述符是否可操作。
程式示例:
#include #include #include #include int main() else if (poll_rslt == 0) else ;
ssize_t n_read = read(stdin_fileno, buf, 5);
if (n_read == -1)
puts(buf);}}
return 0;
}
Linux IO多路復用
一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...
Linux I O多路復用機制
i o多路復用是為了解決程序或執行緒阻塞到某個i o系統呼叫而出現的技術,使程序或執行緒不阻塞某個特定的i o系統呼叫 i o多路復用機制包括select poll epoll i o復用可以監視多個描述符,一旦某個描述符就緒,能夠通知程式進行相應的操作 它的標頭檔案和函式原型如下 includei...
Linux I O多路復用(select)
i o多路復用是在多執行緒或多程序程式設計中常用技術。主要是通過select epoll poll三個函式支援的,就是通過記錄跟蹤每乙個sock i o流 的狀態來同時管理多個i o流,i o 多路復用技術通過把多個 i o 的阻塞復用到同乙個 select 的阻塞上,從而使得系統在單執行緒的情況下...