select() 和 poll()系統呼叫的本質一樣,前者在 bsd unix 中引入的,後者在 system v 中引入的。poll() 的機制與 select() 類似,與 select() 在本質上沒有多大差別,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是 poll() 沒有最大檔案描述符數量的限制(但是數量過大後效能也是會下降)。poll() 和 select() 同樣存在乙個缺點就是,包含大量檔案描述符的陣列被整體複製於使用者態和核心的位址空間之間,而不論這些檔案描述符是否就緒,它的開銷隨著檔案描述符數量的增加而線性增大。
#include
intpoll
(struct pollfd *fds, nfds_t nfds,
int timeout)
;功能:
監視並等待多個檔案描述符的屬性變化
引數說明:
pollfd -- 陣列的位址
nfds: 陣列的最大長度, 陣列中最後乙個使用的元素下標+
1 § 核心會輪詢檢測fd陣列的每個檔案描述符
timeout:
§ -1: 永久阻塞
§ 0: 呼叫完成立即返回
§ >
0: 等待的時長毫秒
返回值:
成功時,poll
() 返回結構體中 revents 域不為 0 的檔案描述符個數;
如果在超時前沒有任何事件發生,poll
()返回 0;
失敗時,poll
() 返回 -
1,並設定 errno 為下列值之一:
ebadf:乙個或多個結構體中指定的檔案描述符無效。
eintr:請求的事件之前產生乙個訊號,呼叫可以重新發起。
einval:nfds 引數超出 plimit_nofile 值。
enomem:可用記憶體不足,無法完成請求。
struct pollfd
;
#include
#include
#include
#include
#include
#include
intmain
(int argc,
char
*ar**)
fd =
open
("test_fifo"
, o_rdwr)
;// 讀寫方式開啟管道
if(fd <0)
ret =0;
fds[0]
.fd =0;
// 標準輸入
fds[1]
.fd = fd;
// 有名管道
fds[0]
.events = pollin;
// 普通或優先順序帶資料可讀
fds[1]
.events = pollin;
// 普通或優先順序帶資料可讀
while(1
)else
if(ret >0)
;if(( fds[0]
.revents & pollin )
== pollin )
elseif(
( fds[1]
.revents & pollin )
== pollin )
}elseif(
0== ret)
}return0;
}
select和poll對比, poll的優點如下
優點:
1).理論上支援無數個檔案描述符
2).省去了核心檢查點陣圖的繁瑣操作
缺點:
1).每次呼叫都會出現一次從使用者空間到核心空間的拷貝
2).每次返回都會出現一次從核心空間到使用者空間的拷貝
3).返回後需要使用者依次掃瞄fds陣列,因此會做很多沒必要的檢查
因此,poll函式會比select的效率稍微高一點
Linux系統程式設計 IO多路復用之select
i o 多路復用技術是為了解決程序或執行緒阻塞到某個 i o 系統呼叫而出現的技術,使程序不阻塞於某個特定的 i o 系統呼叫。select poll epoll 都是i o多路復用的機制。i o多路復用通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒,就是這個檔案描述符...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
i o多路復用
最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...