Linux IO多路復用 多路轉接

2021-10-25 20:02:56 字數 2321 閱讀 5121

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 的阻塞上,從而使得系統在單執行緒的情況下...