多路復用select
問題 當需要等待某個或多個裝置(檔案)可讀或可寫時,
如果使用迴圈不停地檢測是否可讀可寫,則效率很低。
解決辦法:
使用select系統呼叫。
select的用法
man 2 select
int select(int nfds,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
功能:阻塞readfds、writefds和exceptfds中的檔案描述符,
直到其中任乙個檔案描述符達到對應的狀態(可讀、可寫、或錯誤狀態),
或者最久阻塞到指定的超時時間。
檔案描述符集fd_set
相關操作:fd_zero 清空集合
fd_clr 把指定的檔案描述符從集合中刪除
fd_set 把指定的檔案描述符新增到集合中
fd_isset 檢查指定的檔案描述符是否在集合中
時間型別struct timeval
見man 2 select
struct timeval ;
引數1:表示要監聽的檔案描述符個數。
如果為3,則監聽0,1,2
一般取需要監聽的檔案描述符的最大值+1
引數5:超時時間,如果為null, 則表示不使用超時時間,即一直阻塞。
返回值:
成功:返回狀態發生變化的檔案描述符總數
失敗: 返回-1(中斷、無效的檔案描述符、select的引數1/引數5錯誤)
注意:select返回後,檔案描述符集中會發生變化,如果超時,則都清空
超時時間則可能發生變化。
所以,在迴圈監聽中,重新select之前,要重新設定超時時間和檔案描述符集
select返回後,如果返回值》0,
則需要再次檢測,所需要的檔案描述符是否在對應的集合中!
例項 main1.c
迴圈監聽使用者的輸入,一收到就列印輸出。
直到使用者輸入exit
「set_tx_power 30」
atoi(「30」) = 30
atoi(」 30」) = 30
atoi(a30」) = 0
Linux select 多路復用
多路復用select 問題 當需要等待某個或多個裝置 檔案 可讀或可寫時,如果使用迴圈不停地檢測是否可讀可寫,則效率很低。解決辦法 使用select系統呼叫。select的用法 man 2 select int select int nfds,fd set readfds,fd set writef...
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...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...